C 我已经调试了4个小时,但我仍然可以';我找不到窃听器
这是一个程序,从一个文件中输入一些字符串,然后将字符串逐个推入LineBuf,在我们将一个字符串推入LineBuf后,打印LineBuf,然后将LineBuf置空 这是我的代码:C 我已经调试了4个小时,但我仍然可以';我找不到窃听器,c,linux,realloc,freopen,C,Linux,Realloc,Freopen,这是一个程序,从一个文件中输入一些字符串,然后将字符串逐个推入LineBuf,在我们将一个字符串推入LineBuf后,打印LineBuf,然后将LineBuf置空 这是我的代码: #include <stdio.h> #include <stdlib.h> #include <string.h> char *LineBuf = NULL; int BufLen = 0; void PushToBuf(char c) { LineBuf = (cha
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *LineBuf = NULL;
int BufLen = 0;
void PushToBuf(char c)
{
LineBuf = (char *)realloc(LineBuf, (BufLen+2)*sizeof(char));
LineBuf[BufLen] = c;
BufLen++;
LineBuf[BufLen] = '\0';
}
int main()
{
char temp[20];
int i;
FILE *fp;
fp = fopen("input", "r");
while (fgets(temp, 20, fp) > 0)
{
/*Push temp into buf*/
for (i = 0; i < strlen(temp); i++)
PushToBuf(temp[i]);
/*print buf*/
printf("%s\n", LineBuf);
printf("%d\n", BufLen);
/*make buf empty*/
free(LineBuf);
BufLen = 0;
}
return 0;
}
这是运行结果:
This is a test file
19
. Good evening
15
glibc detected ./a.out: double free or corruption (fasttop): 0x00000000023fa250
======= Backtrace: =========
/lib/libc.so.6(+0x775b6)[0x7f2ad01bf5b6]
/lib/libc.so.6(cfree+0x73)[0x7f2ad01c5e83]
./a.out[0x400868]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f2ad0166c4d]
./a.out[0x400699]
这不会使LineBuf为空。它释放了LineBuf的存储空间。当您稍后使用realloc LineBuff时,它会尝试使用realloc释放的空间
/*make buf empty*/
free(LineBuf);
要解决这个问题,请将free移出while循环。空的空闲buff byt将它存储的所有数据设置为null
对于(int i=0;irealloc
afree
'd指针;你不能那样做 工作原理:
ptr
参数指向的内存块大小为
更改为大小
字节,扩展或减少内存量
可在街区内买到。该功能可将内存块移动到新位置,其中
返回新位置的情况
如果ptr
为NULL
,则函数的行为与malloc
完全相同,
分配一个新的size
字节块并返回指向
开始吧
在您的情况下,指针已被释放,但仍然不是NULL
,因此当程序尝试移动此内存块时,会导致内存损坏
要解决此问题,应执行以下操作之一:
- 删除
free()
- 使用
而不是malloc
realloc
- 在
free()之后将
设置为NULLLineBuf
顺便说一句,看看你的代码,我不太确定你打算做什么。根据您想要执行的操作,您可能会放弃LineBuf或FGET。另外:给strlen打电话询问每一个i的表现不是很好,你最好检查一下temp[i]!='\0.在调用free()后,应该将LineBuf设置为NULL。4小时对于查找bug来说并不算多;有些虫子会花你4个星期!!!对于这一个,
valgrind
会对您有所帮助。@user1103180请使用与代码更相关的问题标题此程序仅用于测试~。我编写了一个更大的程序,但我发现PushToBuf函数有一些小问题,经过各种尝试,我复制了该函数并编写了一个小程序来修复我的代码。
/*make buf empty*/
free(LineBuf);