2013-08-17 95 views
-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()); 
    } 
+0

输出是什么?你对输出有什么期望? – lulyon

+5

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

+0

@PaulR:为什么不发表评论作为答案? – alk

回答

4

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

+1

请注意,第一个不需要是ABCD。如果一个程序调用未定义的行为,涉及**整个**代码,并且完全没有任何要求,甚至在控制流程到达错误部分之前也是如此。 – 2013-08-17 14:38:13

2

有什么输出

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

为什么

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

1

首先给出一个ABCD作为输出因为

char* p = "ABCD"; 

在上面的语句是ABCD字符串文字因此它被存储在只读内存。起始加法器获取分配给P,其返回到主.Hence ABCD被打印。

而这里

char p[] = "ABCD"; 

ABCD是不是一个字符串literal.It被分配给本地variable.As我们所知道的局部变量的范围是body.Here你是返回一个局部变量的函数导致未定义的行为。

+0

这是否意味着当调用第二个函数时(如果我们忽略通过优化的非生成代码),文字字符串被复制到局部变量p? – ChronoTrigger

+1

@Chrono触发器是的。 – Light