【问题标题】:Double realloc error...?双重新分配错误...?
【发布时间】:2013-09-30 10:43:51
【问题描述】:

我有一个函数用于扩展数组(图形)并在末尾添加一个新值。对函数的第一次请求很好,但是当我第二次请求时出现问题......

代码:

struct station *addStation(struct station *graph, struct station newStation, size_t  *stationCount){
  size_t newCount = *stationCount+1;

  graph = realloc(graph, newCount*sizeof(struct station));
  *stationCount = newCount;

  graph[*stationCount] = newStation;

  return graph;
}

和请求:

  Station *graph;
  graph = malloc(146*sizeof(Station));

  graph = loadStations(graph, &stationCount);

  Station newStation = graph[0]; // Dummyvalue

  printf("StationCount:%d\n",stationCount);

  graph = addStation(graph, newStation, &stationCount);

  printf("StationCount:%d\n",stationCount);

  graph = addStation(graph, newStation, &stationCount);

由于第二条线图 = addStation... 我在终端中得到一些内存输出错误:

站数:146 站数:147 reseplanerare: malloc.c:2369: sysmalloc: 断言`(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof (size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' 失败。 已中止 (SIGABRT)(已创建内存打印)

我不明白为什么会这样……

【问题讨论】:

    标签: c realloc


    【解决方案1】:

    C 数组从零开始,因此 graph 具有有效索引 [0..newCount-1]

    graph[*stationCount] = newStation;
    

    正在写入超出分配内存的末尾。这会导致未定义的行为。我猜在您的情况下,它破坏了堆管理器用来准确检测这种内存损坏的保护词。

    您可以通过更改您写入的数组索引来解决此问题:

    graph[newCount-1] = newStation;
    

    【讨论】:

    • 太好了,没想到!谢谢!
    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多