簡體   English   中英

使用指針在我自己的strcat中出現總線錯誤

[英]Bus error in my own strcat using pointer

我正在做strcat函數的指針版本,這是我的代碼:

void strcat(char *s, char *t);

int main(void) {
   char *s = "Hello ";
   char *t = "world\n";

   strcat(s, t);

   return 0;
}

void strcat(char *s, char *t) {
  while (*s)
    s++;

  while ((*s++ = *t++))
    ;
}

這似乎很簡單,但是在我的Mac OS 10.10.3上運行時會出現總線錯誤。 我不明白為什么...

在你的代碼中

char *s = "Hello ";

s指向位於只讀存儲器位置的字符串文字 所以,問題是雙重的

  1. 嘗試更改字符串文字的內容會導致未定義的行為

  2. 幾乎忽略了點1 )目標指針沒有足夠的內存來保存合並的最終結果。 內存溢出。 再次是未定義的行為

您應該使用長度足夠大數組 (駐留在讀寫內存中)來保存結果(最終)字符串(不占用內存)。

建議:對於用戶定義的函數,請不要使用與庫函數相同的名稱。 使用其他名稱,例如my_strcat()

偽代碼:

  #define MAXVAL 512
  char s[MAXVAL] = "Hello";
  char *t = "world\n";    //are you sure you want the \n at the end?

接着

  my_strcat(s, t);

您要在最后一個addres s指向之后添加't'文本

char *s = "Hello ";
char *t = "world\n";

但是在's'之后寫入是未定義的行為,因為編譯器可能會將文本放在常量內存中,以您為例,它崩潰了,實際上確實如此。

您應該使用malloc或聲明其數組樣式來保留s指向的足夠內存

char s[32] = "Hello ";

暫無
暫無

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

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