奇怪的未知malloc错误

时间:2017-09-26 21:24:43

标签: c pointers memory malloc

我正在编写一个代码,该代码将文本文件读入最大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*));
}

1 个答案:

答案 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);