C中strcpy()函数返回后复制的字符串为什么为null

pxq42qpu  于 2023-06-05  发布在  其他
关注(0)|答案(2)|浏览(290)

我有以下测试:

char* test1()
{
    char* string = "test 1\n";
    printf("In function: %s", string);
    return string;
}

char* test2()
{
    char* string[10];
    strcpy(string, "test 2\n");
    printf("In function: %s", string);
    return string;
}

int main()
{

    printf("After returned: %s", test1());
    printf("After returned: %s", test2());
}

输出:

In function: test 1
After returned: test 1
In function: test 2
After returned: (null)

test2()中似乎正确打印了string,但返回后变为null
如何正确地返回通过strcpy()构造的字符串,这种行为的原因是什么?
先谢谢你了

toe95027

toe950271#

函数test1返回指向字符串文字的指针

char* test1()
{
    char* string = "test 1\n";
    printf("In function: %s", string);
    return string;
}

字符串文字具有静态存储持续时间。也就是说,函数test1中使用的字符串在退出函数后仍然有效。
函数test2

char* test2()
{
    char* string[10];
    strcpy(string, "test 2\n");
    printf("In function: %s", string);
    return string;
}

没有意义,并调用未定义的行为。
对于初学者,函数strcpy()期望其第一个参数具有char *类型,而用作第一个参数的表达式string在将数组指示符隐式转换为指向其第一个元素的指针之后具有char **类型。在函数printf()的调用中使用的转换说明符%s也需要一个char *类型的参数,但提供的参数类型为char **
同样,函数返回类型是char *,而函数返回类型为char **的表达式,如上所述。
在退出函数后使用返回的指针指向本地数组string,并具有自动存储持续时间,会调用未定义的行为,因为退出函数后数组不是活动的。所以返回的指针无效。

s1ag04yj

s1ag04yj2#

是因为第一段代码使用指针返回一个值,在函数执行完毕后保持不变,在函数1执行完毕后仍然可以访问,然而,第二段代码试图返回一个值,但当它执行完毕后,它不能返回该值,因为字符串不再存在于内存中(对于函数2),因为它是一个字符数组而不是指针,因此您会得到null。同样在函数2中,字符数组被定义为char arr[] = "";。这里对*没有要求,否则它将被视为指向char类型数组的指针,而不是字符数组。

相关问题