2015-10-17 49 views
-5

1)需要了解的printf的行爲

char* fun() 
{ 
    return "awake"; 
} 
int main() 
{ 
    printf("%s",fun()+ printf("I see you")); 
    return 0; 
} 

輸出::我看到youee你

int main() 
{ 
    printf("%s",5+printf("I see you")); 
    return 0; 
} 

輸出::運行時崩潰

1)爲什麼這兩個方案的不同的行爲?

2)任何人都可以解釋爲什麼「清醒」沒有打印在第一個PRINTF?

3)情景1是依賴於編譯器嗎?

+0

爲什麼你會期望兩個有相同的行爲? – juanchopanza

+2

@已否定,我不這麼認爲。它是一個字符串文字。 – juanchopanza

+0

@juanchopanza但函數返回的字符串被忽略。 – ameyCU

回答

4

printf("%s",fun()+ printf("I see you")); 

增加的fun()結果調用printf(),這是整數值9的結果(您的"awake"字符串文字的地址),打印的字符數。這是一個字符地址加上一個整數偏移量 - 完全合法 - 並且它恰好是"I see you"字符串文字中的幾個字符,因此它會打印出「」我看到你「字符串的末尾。

printf("%s",5+printf("I see you")); 

嘗試打印爲NULL結尾的字符串,無論是在在虛擬存儲器地址14,這可能甚至沒有映射到進程的地址空間。