我正在编写一个代码,该代码将文本文件读入最大1024字节的内存块中。为此,我创建了一个包含1016字节数据和指向前一节点的链接列表。我的代码执行完美,动态分配和使用数据,以及完美链接。当必须创建第四个节点时,问题就出现了。 当我手动增加malloc大小(例如将其设置为1200)时,它会在崩溃之前创建48个节点,这表明结构大小增加了。但是当我打印sizeof(* memory)或sizeof(struct Chunk)时,大小保持1024字节。
我收到由使用malloc的行引起的以下错误:
malloc.c:2392:sysmalloc:断言`(old_top == initial_top(av)&& old_size == 0)|| ((unsigned long)(old_size)> = MINSIZE&& prev_inuse (old_top)&& ((unsigned long)old_end&(pagesize - 1))== 0)'失败。 中止(核心倾销)
我的代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char **argv) {
// declare variables
int const CHUNK_SIZE = 1024;
int chunk_index = 0;
struct Chunk {
struct Chunk *previous;
int data[(CHUNK_SIZE-sizeof(struct Chunk*))/sizeof(int)];
};
struct Chunk* memory = (struct Chunk *)malloc(sizeof(struct Chunk));
struct Chunk* temp;
// check if the amount of arguments is as expected
if (argc!=2) {
printf("Usage: reverse <filename>\n");
return -1;
}
// check if the file can be opened
FILE *fp;
fp = fopen(argv[1], "r");
if (fp==0) {
printf("Cannot open file!\n");
return -1;
}
// start program
do {
memory->data[chunk_index] = fgetc(fp);
chunk_index++;
if ( chunk_index*sizeof(int) > CHUNK_SIZE-sizeof(struct Chunk*) ) {
temp = (struct Chunk *)malloc(CHUNK_SIZE);
temp->previous = memory;
memory = temp;
}
}
while(memory->data[(chunk_index-1)]!=EOF && chunk_index<CHUNK_SIZE-sizeof(char*));
}
答案 0 :(得分:0)
代码在分配新内存时遇到问题,因为它没有重置chunk_index
。最终代码尝试访问已分配的memory->data[]
外部。
int chunk_index = 0;
int ch; // add, last value read
do {
ch = fgetc(fp); // save ch
memory->data[chunk_index] = fgetc(fp);
chunk_index++;
if ( chunk_index*sizeof(int) > CHUNK_SIZE-sizeof(struct Chunk*) ) {
temp = (struct Chunk *)malloc(CHUNK_SIZE);
temp->previous = memory;
memory = temp;
chunk_index = 0; // ** add **
}
}
// ** replace **
// while(memory->data[(chunk_index-1)]!=EOF && chunk_index<CHUNK_SIZE-sizeof(char*));
while(ch !=EOF && chunk_index<CHUNK_SIZE-sizeof(char*));
我怀疑chunk_index<CHUNK_SIZE-sizeof(char*)
是否正确。由于单位不匹配,可能不正确。 chunk_index
索引一个数组(例如,每次chunk_index
递增{+ 1}地址更改CHUNK_SIZE-sizeof(char*)
以字节为单位进行测量。)OP需要对此进行检查。我希望while(ch !=EOF);
足够了。
此外,我会在需要时添加一个新块。目前代码将新块与be prepared链接到下一个fgetc(fp)
,这可能不会发生。通过在fgetc(fp)
之前添加新块,代码甚至不需要先前的memory = (struct Chunk *)malloc(sizeof(struct Chunk));
代码,并且可以使用memory = NULL;
提示:不是强制转换和分配常量,而是删除强制转换并分配给引用变量的大小。更容易正确编码,审查和维护。
// temp = (struct Chunk *)malloc(CHUNK_SIZE);
temp = malloc(sizeof *temp);