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
//爲什麼這個不尋常的行爲與指針字符串?
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
//爲什麼這個不尋常的行爲與指針字符串?
您正在調用未定義的行爲。
參考arr+2
設置arr=""
正在拾取任意一塊內存(在這種情況下,您的一個字符串文字)。
當您運行內存佈局使得恆定空字符串之後的字符串常量and %s
自帶的程序。內存看起來是這樣的:
. . . \0 a n d ' ' % s \0 . . .
當您指定空字符串a
,你讓a
指向\0
字符。然後你計算一個+ 2,結果指向n
字符。
因此,當您解讀+ 2爲NULL結尾的字符串所得到nd %s
。
這是當然的,不確定的行爲。許多編譯器佈置常量,以便它們按照使用它們的順序排列:這裏空字符串出現在and %s
之前。但是沒有任何東西會強制編譯器這樣做,並且如果它以不同的方式佈置內存,則會得到不同的結果。該計劃甚至可能會崩潰。
沒有創建一個指向字符串> ..你創造意味着全局變量的存儲空間塊,並constants..and使用指針指向block..You不能改變價值因爲它是常量內存空間的一部分...你正在做的是重新分配指向另一個存儲位置,並期待幸運地指向所需location..it不會總是發生
什麼是你想怎麼辦??? arr + 2是無效位置 – 999k 2013-03-26 13:05:08
但爲什麼這種無效輸出? 即使我這樣做:arr =「y」 看到相同的輸出 – 2013-03-27 13:51:18