1

这是程序从一个文件中输入一些字符串,然后,将字符串一个一个地推入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. Good evening
bye~

这是运行结果:

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]
4

4 回答 4

1

这不会使 LineBuf 为空。它释放了 LineBuf 的存储空间。当您稍后重新分配 LineBuff 时,它会尝试重新分配释放的空间。

    /*make buf empty*/
    free(LineBuf);

解决provlem 将free 移出while 循环。并清空空闲缓冲区字节,将其存储的所有数据设置为空。

for(int i =0; i < BuffLen) LineBuf[i]='\0';

于 2011-12-17T14:47:50.637 回答
1

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

于 2011-12-17T14:48:56.340 回答
1

工作原理realloc ( void * ptr, size_t size )

参数指向的内存块的大小ptr变为size字节,扩大或减少块中可用的内存量。该函数可以将内存块移动到新位置,在这种情况下,将返回新位置。

在这种情况下ptrNULL该函数的行为与 完全相同malloc,分配一个新的size字节块并返回一个指向它开头的指针。

在您的情况下,指针已经被释放,但仍然没有NULL,所以当程序试图移动这个内存块时,它会导致内存损坏。

要解决它,您应该执行以下操作之一:

  • 删除free().
  • 使用malloc而不是realloc.
  • 后设置LineBuf为 NULL free()
于 2011-12-17T14:49:15.007 回答
0

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

顺便说一句,看着你的代码,我不太确定你打算做什么。根据您想要做什么,您可能会摆脱 LineBuf 或 fgets。另外:为每个 i 调用 strlen 的性能不是很好,您最好检查一下 temp[i] != '\0'。

于 2011-12-17T15:09:14.747 回答