2013-08-17 96 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