C在分配内存时失败



我在C中创建了一个数组列表,每次我试图重新分配数组(用于扩展它)第三次,我得到这个错误消息:

malloc.c: 3096: sYSMALLOc:断言(old_top = = (((mbinptr) (((char *)和((av) ->垃圾箱(((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) ->大小,0 x1),,((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("%dn", i);
    }
    printf("Capacity: %dn", tmp->capacity);
    printf("Size: %dn", tmp->size);
    arraylist_free(tmp);
}

有人知道答案吗?或者有类似的情况?

代码:

calloc(sizeof(char), N)

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

你需要这样做:

calloc(N, sizeof(char*))

注意是char*,不是char

(我也颠倒了参数以匹配calloc期望的,但实际上这不应该有任何区别。)

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

相关内容

  • 没有找到相关文章

最新更新