2012-04-02 23 views
0

我已經寫了兩段代碼,我打算輸出相同的輸出,但容易混淆,輸出不同。修改和打印字符串不會導致預期的輸出

代碼的第一片:

#include<stdio.h> 
int main(){ 
    char a[]="abc"; 
    char *p=&a; 
    char c=++(*p); 
    printf("%c,%s\n",c,p); 
    return 0; 
} 

此輸出以下:

B,BBC

第二件的代碼:

#include<stdio.h> 
int main(){ 
    char *p="abc"; 
    char c=++(*p); 
    printf("%c,%s\n",c,p); 
    return 0; 
} 

,其輸出:

一個,ABC

什麼在第二代碼段,其防止字符串的第一個字符從遞增發生?

+0

它可能發生在某些系統中,因爲第二個代碼的「abc」位於無法更改的內存區域中。在第一個應用程序中,字符串「abc」在堆棧中始終可以修改。 – rbelli 2012-04-02 16:08:34

回答

4

第二個示例試圖更改未定義行爲的字符串文字。你通常會因爲這樣做而崩潰,但在你的情況下,它似乎只是「被忽略」。

char *p="abc"; 
char c=++(*p); /* Illegal to change *p. */ 

標準報價:

它是unspeci音響ED這些陣列是否是不同的提供 其元素具有適當的值。如果程序 試圖修改這樣一個數組,行爲是不確定的。

+0

* p ++在這個表達式中哪個運算符會得到優先 – 2012-04-02 16:04:45

+1

@CallYS但是你使用了括號。 – cnicutar 2012-04-02 16:05:27

+0

我還有一個疑問..... #include int main(){ char * p; char * a =「yogi」; p = a; char c = ++(* p); printf(「%c,%s,%s」,c,p,a); return 0; } 這次輸出的是y,yogi,yogi 但我期待z,zogi,yogi。 – 2012-04-03 09:25:43