我有以下测试:
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()
构造的字符串,这种行为的原因是什么?
先谢谢你了
2条答案
按热度按时间toe950271#
函数
test1
返回指向字符串文字的指针字符串文字具有静态存储持续时间。也就是说,函数
test1
中使用的字符串在退出函数后仍然有效。函数
test2
没有意义,并调用未定义的行为。
对于初学者,函数
strcpy()
期望其第一个参数具有char *
类型,而用作第一个参数的表达式string
在将数组指示符隐式转换为指向其第一个元素的指针之后具有char **
类型。在函数printf()
的调用中使用的转换说明符%s
也需要一个char *
类型的参数,但提供的参数类型为char **
。同样,函数返回类型是
char *
,而函数返回类型为char **
的表达式,如上所述。在退出函数后使用返回的指针指向本地数组
string
,并具有自动存储持续时间,会调用未定义的行为,因为退出函数后数组不是活动的。所以返回的指针无效。s1ag04yj2#
是因为第一段代码使用指针返回一个值,在函数执行完毕后保持不变,在函数1执行完毕后仍然可以访问,然而,第二段代码试图返回一个值,但当它执行完毕后,它不能返回该值,因为字符串不再存在于内存中(对于函数2),因为它是一个字符数组而不是指针,因此您会得到null。同样在函数2中,字符数组被定义为
char arr[] = "";
。这里对*
没有要求,否则它将被视为指向char
类型数组的指针,而不是字符数组。