[英]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
給出無效的新大小錯誤的情況下。 請幫助找到連接的替代方案,期待對像我這樣的懶惰程序員來說是一個有用的問題。
您的代碼有幾個問題:
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.