-3

以下代码是一个面试问题,我无法理解输出。任何人都可以帮忙吗?谢谢。

#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());
    }
4

3 回答 3

4

第一个是预期的 ABCD,第二个是未定义的行为,因为您正在返回一个超出范围的局部变量。

于 2013-08-17T14:08:09.603 回答
2

输出是什么

我们不知道。任何输出都是有效的...

为什么

...因为代码调用未定义的行为。在第二个函数中,您将返回一个指向具有自动存储持续时间的块范围数组的第一个元素的指针,这是非法的。

于 2013-08-17T14:05:55.067 回答
1

第一个给出 ABCD 作为输出,因为

  char* p = "ABCD";

在上面的语句中,ABCD 是字符串文字,因此它被存储在只读内存中。起始加法器被分配给 p,然后返回给 main。因此 ABCD 被打印出来。

而这里

 char p[] = "ABCD";

ABCD 不是字符串文字。它被分配给局部变量。正如我们所知,局部变量的范围是函数体。在这里,您将返回一个导致未定义行为的局部变量。

于 2013-08-17T14:11:36.927 回答