2013-03-26 21 views
-1
int main() 
{ 

char *arr="hello"; 
clrscr(); 
printf("%s",arr); 
arr=""; 

    printf("and %s",arr+2); 
getch(); 

return 0; 
}! 

這段代碼的輸出: -爲什麼%s被視爲字符。串爲什麼這樣不尋常的行爲指針

helloand ND%S

點擊此處查看: -
http://ideone.com/TJzUvp

//爲什麼這個不尋常的行爲與指針字符串?

+0

什麼是你想怎麼辦??? arr + 2是無效位置 – 999k 2013-03-26 13:05:08

+0

但爲什麼這種無效輸出? 即使我這樣做:arr =「y」 看到相同的輸出 – 2013-03-27 13:51:18

回答

1

您正在調用未定義的行爲。

參考arr+2設置arr=""正在拾取任意一塊內存(在這種情況下,您的一個字符串文字)。

1

當您運行內存佈局使得恆定空字符串之後的字符串常量and %s自帶的程序。內存看起來是這樣的:

. . . \0 a n d ' ' % s \0 . . . 

當您指定空字符串a,你讓a指向\0字符。然後你計算一個+ 2,結果指向n字符。

因此,當您解讀+ 2爲NULL結尾的字符串所得到nd %s

這是當然的,不確定的行爲。許多編譯器佈置常量,以便它們按照使用它們的順序排列:這裏空字符串出現在and %s之前。但是沒有任何東西會強制編譯器這樣做,並且如果它以不同的方式佈置內存,則會得到不同的結果。該計劃甚至可能會崩潰。

+0

+1爲解釋結果得到了! – 999k 2013-03-26 13:11:26

+0

但是爲什麼它總是從字符串採取的printf()的?? .. 我的陣列ARR =「」不指向第一個索引(「\ 0」 ACC。到u)中的printf字符串 – 2013-03-29 14:27:26

+0

沒有的,它指向在'printf'的參數之前的0字節,這會產生一個空字符串。如果你添加一個「a + 1」,你會得到一個超過零的字節的地址,它是'a'。如果你加兩個「a + 2」,你會得到'n'的地址。理解? – Joni 2013-03-29 16:10:16

0

沒有創建一個指向字符串> ..你創造意味着全局變量的存儲空間塊,並constants..and使用指針指向block..You不能改變價值因爲它是常量內存空間的一部分...你正在做的是重新分配指向另一個存儲位置,並期待幸運地指向所需location..it不會總是發生

相關問題