C 我已经调试了4个小时,但我仍然可以';我找不到窃听器

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

这是一个程序,从一个文件中输入一些字符串,然后将字符串逐个推入LineBuf,在我们将一个字符串推入LineBuf后,打印LineBuf,然后将LineBuf置空

这是我的代码:

#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;iLineBuf[i]='\0'

您正在尝试
realloc
a
free
'd指针;你不能那样做

工作原理:

ptr
参数指向的内存块大小为 更改为
大小
字节,扩展或减少内存量 可在街区内买到。该功能可将内存块移动到新位置,其中 返回新位置的情况

如果
ptr
NULL
,则函数的行为与
malloc
完全相同, 分配一个新的
size
字节块并返回指向 开始吧

在您的情况下,指针已被释放,但仍然不是
NULL
,因此当程序尝试移动此内存块时,会导致内存损坏

要解决此问题,应执行以下操作之一:

  • 删除
    free()
  • 使用
    malloc
    而不是
    realloc
  • free()之后将
    LineBuf
    设置为NULL

free(LineBuf)用于释放内存,但稍后调用realloc时,您将再次使用LineBuf。释放LineBuf后应将其设置为NULL,然后realloc将执行malloc而不是重新分配。请记住,释放指针后将其设置为NULL始终是一种良好的做法。这有助于检测您是否正在使用指针释放内存


顺便说一句,看看你的代码,我不太确定你打算做什么。根据您想要执行的操作,您可能会放弃LineBuf或FGET。另外:给strlen打电话询问每一个i的表现不是很好,你最好检查一下temp[i]!='\0.

在调用free()后,应该将LineBuf设置为NULL。4小时对于查找bug来说并不算多;有些虫子会花你4个星期!!!对于这一个,
valgrind
会对您有所帮助。@user1103180请使用与代码更相关的问题标题此程序仅用于测试~。我编写了一个更大的程序,但我发现PushToBuf函数有一些小问题,经过各种尝试,我复制了该函数并编写了一个小程序来修复我的代码。
    /*make buf empty*/
    free(LineBuf);