[英]Strange behavior of 'char' pointers
當我聲明並運行以下命令時,出現了段錯誤 。
main()
{
char *p = "boa";
*(p+1) = 'y';
printf("%s",p);
}
我懷疑char *p
是常量,等等。
但是以下工作正常。
main()
{
int i = 300;
char *p = (char*)&i;
*(p+1) = 'y';
printf("%s",p);
}
這背后的原因是什么? 上面的規則也不適用嗎?
那取決於您對“工作正常”的定義。 但是賦值不會造成分段錯誤的原因是因為p
指向了i
變量的地址,這顯然不是一個常數。 i
被分配了一個常數,但是i
本身不是一個常數。
對於i = 300
(假設小端字節為x86 ):
+--+--+--+--+
i:|2c|01|00|00|
+--+--+--+--+
.
/|\
|
p:&i
在*(p+1) = 'y'
+--+--+--+--+
i:|2c|79|00|00|
+--+--+--+--+
.
/|\
|
p:&i
因此,print語句恰好為您打印了,y
,但這僅僅是因為您依賴於平台的字節順序(並且2c
是可打印的ASCII字符)。 在大型字節序機器上,和/或如果它不是非ASCII,情況可能會有所不同。
好家伙...
第一個段錯誤是由於字符串為const
(您已經說對了)。 但是,第二個問題是對指針語義的一種令人着迷的濫用! ;-)
這是第二個示例中的操作:
int
(在您的情況下為300
) int
的地址-基本上是一個地址,該地址持有一個(32位?) int
為300的位置,並將其轉換為char*
,其中每個元素都指向一個8位值 區別是:
char *p="boa";
p
是一個指針 。 您將p
指向無法修改的字符串文字"boa"
,並且在嘗試對其進行修改時會發生段錯誤。
int i=300;
char *p=(char*)&i;
i
是int
類型的變量,您只使用常量300
初始化i
並將i
的值300
逐位復制到i
的位置,但是您永遠不會指向常量本身,而只是將其用作初始化程序。 區別在於, p
一個示例中的p
指向常量字符串文字,而第二個示例中的p
指向int
類型的變量。 因此,以后使用指針p
修改i
的位置就可以了,因為您正在修改非常數對象i
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.