簡體   English   中英

“ char”指針的奇怪行為

[英]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位值
  • 獲取“第一個” 8位值的地址,加1(增加8位(!)),然后將這8位的值更改為數字ASCII碼“ y”
  • 打印“結果字符串”

區別是:

char *p="boa";

p是一個指針 您將p指向無法修改的字符串文字"boa" ,並且在嘗試對其進行修改時會發生段錯誤。

int i=300;
char *p=(char*)&i;

iint類型的變量,您只使用常量300初始化i並將i的值300逐位復制到i的位置,但是您永遠不會指向常量本身,而只是將其用作初始化程序。 區別在於, p一個示例中的p指向常量字符串文字,而第二個示例中的p指向int類型的變量。 因此,以后使用指針p修改i的位置就可以了,因為您正在修改非常數對象i

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM