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'后不久就给我一个seg错误,并且基于打印语句它似乎发生了在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断言事件,它会中止该程序。
答案 0 :(得分:1)
你可能想要getline(3),所以use如果你拥有它。正如AnT's answer所解释的那样,由于undefined behavior,您有buffer overflow(UB)。尽快解决这个问题。非常{4}的UB并且花更多的时间来阅读它(这很棘手)。
另外,请记住,scared和malloc(3)都是昂贵的电话(对于一些合适的昂贵概念;实际上,它们非常快 - 在桌面上通常不到一微秒才能合理使用) ,他们可能会失败(通过提供NULL
),你应该realloc(3)那个。
在实践中,您最好不要经常使用realloc
。根据经验,您希望在某处保留使用的长度和分配的大小(例如,在其他局部变量中),并且您可以使用一些几何级数(例如newsize = 4*oldsize/3 + 10
....)以避免过于频繁realloc
- 秒。为每个附加字节执行realloc
是很难看的。
使用所有警告和调试信息编译代码,例如: gcc -Wall -Wextra -g
gdb
var productData = jQuery(data.replace(/(<script.*?)(<\/script>)/gs, "")).find('.product-essential');
。改进代码以获得警告。 check {{1}}和GCC寻找Use the debugger等问题。