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("%cn", 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;
}
因此,我设法使用打印语句打印了字符串的前12个字母围绕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("%cn", text[i-1]);
text = realloc(text, i+1);
i++;
x++;
}
printf("%dn", i-1);
text[i-1] = 'n';
printf("%c", text[i-1]);
text = realloc(text, i+1);
i++;
x = 0;
curr = curr->next;
//printf("%cn", curr->line[0]);
}
我尝试修复了索引错误,这是一个非常长的sysmalloc断言的东西,它逐渐流产。
您可能想要getline(3),因此,如果有的话,请使用它。正如Ant的答案所解释的那样,由于缓冲区溢出,您的行为(UB)不确定。尽快解决该问题。非常害怕UB,花更多的时间阅读(这很棘手)。
另外,请记住,Malloc(3)和Realloc(3)都是昂贵的电话(对于某些合适的昂贵概念;实际上,它们非常快 - 通常比桌面上的微秒少,以供合理使用),并且他们可能会失败(通过给出NULL
),您应该检查一下。
实际上,您最好更少使用realloc
。根据经验,您希望同时将使用的长度和分配的大小保持在某个地方(例如,在其他局部变量中),并且您可能会使用一些几何进程(例如newsize = 4*oldsize/3 + 10
....)避免过于频繁的realloc
-S。为每个附加字节进行realloc
是丑陋的。
使用所有警告和调试信息编译您的代码,例如gcc -Wall -Wextra -g
与GCC。改进代码,以免发出警告。使用调试器gdb
和Valgrind来狩猎内存泄漏和其他麻烦。