簡體   English   中英

C函數在char []段錯誤中交換兩個字符,盡管不使用字符串文字

[英]C function to swap two chars in a char[] segfaults, despite not working with string literals

我已在GDB中驗證程序在*(a)= *(b)行崩潰。 這對我來說沒有意義。

在我的main函數中,我為char *字符串分配了5個字節。 我傳遞兩個指向swap的指針,一個是sizeof(char)的字符串偏移量,另一個是指向string的指針。 這些指針被復制到swap()的調用堆棧。 我之前分配的5個字節仍然應該在堆棧上,因此swap()在解除引用和寫入堆棧上的那些位置時應該沒有問題,對吧?

  int main(int argc, char* argv[])
  {
      char *string = "abcd";
      swap((string+1), string);
      printf("%s\n",string);
      return 0;
  }

  void swap(char *a, char *b)                                                                                                                                                                       
  {
       if(!a || !b)
           return;

       char temp = *(a);
       *(a) = *(b);
       *(b) = temp;
   }
char *string = "abcd";

是指向字符串文字的指針,字符串文字在C中是不可變的。修改字符串文字會調用未定義的行為。

string的聲明更改為:

char string[] = "abcd";

修復你的程序。 這里string是一個數組,用字符串文字的內容初始化並且是可修改的。

"abcd"這樣的字符串文字是只讀的,你不能改變它們。 采用

char string[] = "abcd";

代替。

你應該使用char string[] = "abcd"; ,因為字符串在char* string= "abcd";是不可改變的char* string= "abcd";

暫無
暫無

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

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