簡體   English   中英

使用strcat和realloc的連接會產生意外錯誤

[英]Concatenation using strcat and realloc produce unexpected errors

我遇到了所謂的神秘realloc invalid next size error ,我在linux上使用gcc我的代碼是

 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>

int main()
{
 int i;
 char *buf;
 char loc[120];
 buf = malloc(1);
 int size;

 for(i=0;i<1920;i++)
  {
    sprintf(loc,"{Fill_next_token = my_next_token%d; Fill_next_token_id = my_next_token_id = my_next_token_id%d}",i,i);
    size = strlen(buf)+strlen(loc);
    printf("----%d\n",size);

    if(!realloc(buf,size))
    exit(1);
    strcat(buf,loc);
    }
  }

(我可能是重復的問題) 這里解決方案的地方在於避免strcat並使用memcpy ,但在我的情況下我真的想連接字符串。 上面的代碼適用於這樣的920次迭代,但是在1920 realloc給出無效的新大小錯誤的情況下。 請幫助找到連接的替代方案,期待對像我這樣的懶惰程序員來說是一個有用的問題。

您的代碼有幾個問題:

  • 在決定新長度時,你不考慮null終止符 - 它應該是size = strlen(buf)+strlen(loc)+1;
  • 您忽略了realloc的結果 - 您需要將其檢查為零,然后將其分配回buf
  • 你沒有將buf初始化為空字符串 - 這會使第一次調用strlen產生未定義的行為(即你需要添加*buf = '\\0';

修復這些錯誤后,您的代碼應該正確運行:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
   int i;
   char *buf= malloc(1);
   *buf='\0';
   char loc[120];

   for(i=0;i<1920;i++) {
      sprintf(loc,"{Fill_next_token = my_next_token%d; Fill_next_token_id = my_next_token_id = my_next_token_id%d}",i,i);
      int size = strlen(buf)+strlen(loc)+1;
      printf("----%d\n",size);
      char *tmp = realloc(buf,size);
      if(!tmp) exit(1);
      buf = tmp;
      strcat(buf, loc);
   }
}

演示。

buf不是一個有效的字符串,因此strcat()將失敗,因為它期望一個\\0終止的字符串。

如果你想realloc() buf那么你應該將realloc()的返回值分配給你沒有做的buf。

char *temp = realloc(buf,size+1);
if(temp != NULL)
buf = temp;

要點1.始終使用realloc()的返回值來訪問新分配的內存。

Point 2. strcat()需要一個以null結尾的字符串。 檢查第一個迭代案例。

暫無
暫無

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

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