分配内存时C失败

时间:2013-06-19 15:25:42

标签: c arraylist malloc

我在C中创建一个arraylist,每当我第三次尝试重新分配数组(用于扩展它)时,我收到此错误消息:

  

malloc.c:3096: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)'失败。   中止

我的代码如下:

#include <stdlib.h>

#include "arraylist.h"

ARRAYLIST* newArrayList() {
    ARRAYLIST* arraylist = malloc(sizeof(ARRAYLIST));
    arraylist->size = 0;
    arraylist->increasingStep = 2500;
    arraylist->capacity = arraylist->increasingStep;
    arraylist->array = calloc(sizeof(char), arraylist->increasingStep);
}

void arraylist_put(ARRAYLIST* list, char* value) {
    if (list->size >= list->capacity) {
        arraylist_expand(list);
    }

    list->array[list->size] = value;
    list->size++;
}

void arraylist_expand(ARRAYLIST* list) {
    list->capacity += list->increasingStep;
    char** tmp = list->array;
    list->array = calloc(sizeof(char), list->capacity);

    int i;
    for (i = 0; i < list->size; i++) {
        list->array[i] = tmp[i];
    }
}

void arraylist_free(ARRAYLIST* list) {
    free(list);
}

主文件:

int main(char** argv, int argc) {
    ARRAYLIST* tmp = newArrayList();
    int i;
    for (i = 0; i < 30000; i++) {
        arraylist_put(tmp, "TEST");
        printf("%d\n", i);
    }
    printf("Capacity: %d\n", tmp->capacity);
    printf("Size: %d\n", tmp->size);

    arraylist_free(tmp);
}

有人知道解决方案吗?或者有类似的情况?

2 个答案:

答案 0 :(得分:2)

此代码:

calloc(sizeof(char), N)

分配一个N字节大的内存块(因为sizeof(char)是1),然后将其视为N个指针的数组。那会溢出并破坏你的堆。

你需要这样做:

calloc(N, sizeof(char*))

请注意,它是char*,而不是char

(我也推翻了与calloc预期相符的论据,但实际上这不应该有任何区别。)

答案 1 :(得分:1)

你的程序有一些奇怪的逻辑,但你真正的问题是你已经分配了空间来存储2500 char个对象,但是你在重新分配之前存储了2500个char *个对象。这意味着你已经覆盖了数组的末尾。看起来您在某一时刻会覆盖一些重要的malloc簿记结构。如果没有ARRAYLIST的定义,很难说你覆盖了多少或者什么时候可能发生。