以下代码是一个面试问题,我无法理解输出。有人可以帮忙吗?感谢。
#include <stdio.h>
char* string_1()
{
char* p = "ABCD";
return p;
}
char* string_2()
{
char p[] = "ABCD";
return p;
}
int main(void)
{
printf("%s\n",string_1());
printf("%s\n",string_2());
}
答案 0 :(得分:4)
第一个是预期的ABCD,第二个是未定义的行为,因为你正在返回一个超出范围的局部变量。
答案 1 :(得分:2)
输出是什么
我们不知道。任何输出都是有效的......
以及为什么
...因为代码调用了未定义的行为。在第二个函数中,您将返回一个指向具有自动存储持续时间的块作用域数组的第一个元素的指针,这是非法的。
答案 2 :(得分:1)
第一个将ABCD作为输出,因为
char* p = "ABCD";
在上面的语句中,ABCD是字符串文字,因此它存储在只读存储器中。起始加法器被赋值给p,它被返回到main .Hence ABCD被打印出来。
而在这里
char p[] = "ABCD";
ABCD不是字符串文字。它被分配给局部变量。我们知道局部变量的范围是函数体。这里是你返回一个导致未定义行为的局部变量。