我的程序是用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分配的空间超出了我的要求,但我认为这是正常的。
有什么想法吗?
答案 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()
的参数中删除。