C-奇怪的未知杂物错误



我正在编写一个代码,该代码在最大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);

相关内容

  • 没有找到相关文章

最新更新