gpt4 book ai didi

c - 奇怪的段错误,可能与 realloc 有关

转载 作者:行者123 更新时间:2023-11-30 20:19:54 25 4
gpt4 key购买 nike

char *dumpTB (TB tb){

char* text = malloc(sizeof(char));

int i = 0; //
int x = 0; //string index

tNode* curr = tb->head;

while(curr != NULL){

while(curr->line[x] != '\n'){
printf("%d", i);
text[i] = curr->line[x];
printf("%c\n", text[i]);

text = realloc(text, i+1);

i++;
x++;
}
text[i] = '\n';
printf("%c", text[i]);
text = realloc(text, i+1);
i++;

x = 0;
curr = curr->next;
}

return text;
}

因此,我设法使用 print 语句打印出字符串的前 12 个字母,但由于某种原因,在打印第 12 个字母“l”后不久,它给了我一个段错误,并且根据 print 语句,它似乎发生了围绕 realloc...谁能告诉我我做错了什么?

int i = 1; // 
int x = 0; //string index

tNode* curr = tb->head;

while(curr != NULL){

while(curr->line[x] != '\n'){
printf("%d", i-1);
text[i-1] = curr->line[x];
printf("%c\n", text[i-1]);

text = realloc(text, i+1);
i++;
x++;
}
printf("%d\n", i-1);
text[i-1] = '\n';
printf("%c", text[i-1]);
text = realloc(text, i+1);
i++;

x = 0;
curr = curr->next;
//printf("%c\n", curr->line[0]);
}

我尝试修复索引错误,这是一个看起来很长的 sysmalloc 断言,它会中止程序。

最佳答案

你可能需要 getline(3) ,所以如果你有的话,就使用 use 。正如 AnT's answer 所解释的,由于 undefined behavior ,您有 buffer overflow (UB) 。尽快解决这个问题。非常 UB 的 scared 并花更多时间阅读它(这很棘手)。

此外,请记住 malloc(3)realloc(3) 都是某种昂贵的调用(对于某些合适的昂贵概念;实际上,它们非常快 - 在桌面上合理使用时通常不到一微秒),并且它们可能会失败(通过给出NULL ),你应该 check

实际上,您最好少用 realloc。根据经验,您希望将使用的长度和分配的大小保留在某处(例如在其他局部变量中),并且您可以使用一些几何级数(例如 newsize = 4*oldsize/3 + 10 ....)来避免过于频繁的 realloc -s。对每个额外的字节执行 realloc 是很丑陋的。

使用所有警告和调试信息编译代码,例如gcc -Wall -Wextra -gGCC 。改进代码以消除警告。 Use the debugger gdbvalgrind 来寻找 memory leaks 和其他麻烦。

关于c - 奇怪的段错误,可能与 realloc 有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47913455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com