C:帮助查找内存故障

时间:2012-10-01 19:37:12

标签: c memory-leaks malloc

我的程序是用C语言编写的,它是一个磁盘模拟器。我完成了它的编写,当我注释掉我的测试程序的某些行时它运行,但是我得到了一个内存错误,我在那里取消注释。我怀疑这是我的char *。

我注释掉的行(以及程序崩溃的地方)是

free(buffer);

其中buffer是从磁盘读入的字节字符串的char *。它最初使用malloc分配了30个字节。

char* buffer = (char *) malloc(sizeof(char) * 30);

这里发布的内容太多了,所以我要把我写作/复制的部分放到char *上,希望有人能看到我做错了。

我认为这不是太复杂,我只是不熟悉C识别明显的记忆错误。

 // In the event of a cache miss:

 // block_buffer to pass to add_cache_entry
 char cMissBuffer[BLOCK_SIZE];

 // read content of block from disk 
 fread(cMissBuffer,sizeof(char),BLOCK_SIZE,diskEntity.pBlockStore);

 // add to cache
 if(1==add_cache_entry(i,cMissBuffer)) return 1;
 .
 .
 .
 // some of what is in add_cache_entry

 int add_cache_entry(int v, char *block_buffer)
 {
    // ...
    // construct a new queue element
    QueueElement *block_to_cache = (QueueElement*)malloc(sizeof(QueueElement));
    block_to_cache->blkidx = v;

    block_to_cache->content=(char*)malloc(BLOCK_SIZE);
    strcpy(block_to_cache->content,block_buffer);
// ...
 }

在测试中,BLOCK_SIZE为5,QueueElement是一个struct,content是一个带有BLOCK_BYTES信息的char *。

以下是运行可执行文件(转储队列)的摘录...我认为缺少'\ 0'可能与问题有关...

after adding cache entry (5):
DUMP:
BLOCK 5 FLAG:0 CONTENT:222220000000
BLOCK 4 FLAG:0 CONTENT:222220000000
BLOCK 3 FLAG:0 CONTENT:000000000000
BLOCK 2 FLAG:0 CONTENT:000000000000
BLOCK 1 FLAG:1 CONTENT:11100

我认为我获得了额外的空间,因为malloc分配的空间超出了我的要求,但我认为这是正常的。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

行为的一个可能原因是strcpy()要求源字符串为空终止,这不是这里的情况,因为fread()没有为您附加空终止符(也不能在这种情况为fread()正在读取确切的缓冲区大小)。 strcpy()还会附加一个空终止符,这意味着strcpy()调用肯定会在block_to_cache->content缓冲区之外写入。

如果数据未用作C样式字符串,请使用memcpy()复制数据:

memcpy(block_to_cache->content, block_buffer, BLOCK_SIZE);

其他要点:

  • 检查fread()的返回值,以确保在尝试使用缓冲区之前成功填充缓冲区。
  • 无需转换malloc()的返回值(请参阅Do I cast the result of malloc?)。
  • 检查malloc()的返回值以确保已成功分配内存。
  • sizeof(char)保证是一个,因此可以从malloc()的参数中删除。