我正在编写一个代码,该代码在最大1024字节的内存中读取文本文件。为此,我正在创建一个带有1016个字节数据的链接列表和一个指向上一个节点的指针。我的代码可以完美,动态地分配和使用数据,并完美地链接。当问题必须创建第四个节点时,问题就会到达。当我手动增加Malloc大小(例如,将其设置为1200)时,它会在崩溃之前创建48个节点,这表明结构尺寸增加。但是,当我打印大小(*内存)或sizeof(struct块)时,大小保持1024字节。
我得到了我使用malloc的行引起的以下错误:
malloc.c:2392:sysmalloc:断言`(old_top == prinity_top(av)&& old_size == 0)||(((unsigned long)(old_size)> = minsize&& prev_inuse (old_top)&&(((无符号长)old_end&(pageize -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*));
}
代码在分配新内存时遇到麻烦,因为它不重置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
索引一个数组(示例A 4地址每次chunk_index
增量时都会更改CHUNK_SIZE-sizeof(char*)
的测量。)OP将需要查看此信息。我希望while(ch !=EOF);
足够了。
此外,我会在需要时添加一个新块。目前,代码链接了一个新的块,为下一个fgetc(fp)
准备,这可能不会发生。通过在fgetc(fp)
之前添加新块,代码甚至不需要先前的memory = (struct Chunk *)malloc(sizeof(struct Chunk));
代码,并且可以使用memory = NULL;
提示:而不是铸造和分配给常量,而是放下铸件并分配到引用变量的大小。易于正确编码,审查和维护。
// temp = (struct Chunk *)malloc(CHUNK_SIZE);
temp = malloc(sizeof *temp);