使用strcat和realloc的连接会产生意外错误

时间:2015-01-07 14:39:21

标签: c linux string gcc string-concatenation

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

 #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);
    }
  }

(我可能是重复的问题)here某处的解决方案是避免使用strcat并使用memcpy,但在我的情况下,我真的想连接字符串。上面的代码适用于这样的920次迭代,但是在1920 realloc给出无效的新大小错误的情况下。请帮助找到连接的替代方案,期待对像我这样的懒惰程序员来说是一个有用的问题。

3 个答案:

答案 0 :(得分:5)

您的代码有几个问题:

  • 在决定新的长度时,您没有考虑空终止符 - 它应该是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);
   }
}

Demo.

答案 1 :(得分:1)

buf不是有效字符串,因此strcat()会失败,因为它需要\0终止字符串。

如果您想要realloc() buf,那么您应该将realloc()的返回值分配给您未执行的buf。

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

答案 2 :(得分:0)

要点1.始终使用realloc()的返回值来访问新分配的内存。

Point 2. strcat()需要一个以null结尾的字符串。检查第一个迭代案例。