C 中的 realloc 函数导致"realloc(): invalid pointer:"错误



我正在尝试在C中创建一个动态整数数组,该数组应在完整后自动加倍。

为了扩展数组的大小,我想使用realloc函数。不幸的是,指向我的DynamicArray和GCC崩溃数据的指针似乎存在一些问题:(有人知道为什么?如果我在使用Malloc之后我进行了Realloc,则没有崩溃。我已经检查了指针地址,并且是在Malloc和Realloc之间没有更改。

以下是我的标题文件声明:

   struct DynamicArray
    {
        unsigned int size;
        unsigned int capacity;
        int *data;
    };   // -----  end of struct DynamicArray  -----
    typedef struct DynamicArray DynamicArray;

    // #####   EXPORTED FUNCTION DECLARATIONS   
    DynamicArray* dn_new ( unsigned int capacity );
    int dn_append ( DynamicArray *a, int elem );

这是我用于测试的主要类:

    int
main ( int argc, char *argv[] )
{
    DynamicArray *a1;
    int                     i;
    a1 = dn_new ( 5 );
    // here six integers are inserted, the sixth causes the realloc crash as this is where I want to extend
    dn_append ( a1,  5 );
    dn_append ( a1,  7 );
    dn_append ( a1,  8 );
    dn_append ( a1, 11 );
    dn_append ( a1, 13 );
    dn_append ( a1, 15 );

    return 0;
}   // -----  end of function main  -----

这些是dn_append和dn_new的函数,由主要:

调用
    DynamicArray*
    dn_new ( unsigned int capacity )
    {
        struct DynamicArray *a = malloc(sizeof(struct DynamicArray));

        a->data = (int *)calloc(capacity,capacity * sizeof(int));
        printf("allocated %dn",a->data);
        a->size=0;
        a->capacity=capacity;
        printf("array createdn");
        if (a == NULL){
            return NULL;
        }
        else{
            return a;   
        }
    } 
int
dn_append ( DynamicArray *a, int elem )
{   
    short extended = 0;
    if (a->size==a->capacity){
        a->capacity=a->capacity*2;
        printf("allocated %dn",a->data);
//here is exactly where the error occurs
        a->data = (int *)realloc(a->data,a->capacity * sizeof(int));
        printf("array extended to have capacity for %d integersn",a->capacity);
    extended=1;
}
    a->data[(a->size-1)] = elem;
    a->size++;
    printf("element %d appended to arrayn",elem);
    return extended;
} 

考虑首先将值插入空数组时会发生什么。您的dn_append代码具有:

a->data[(a->size-1)] = elem;
a->size++;

a->size为0时,将其写入索引-1时,在数组的开始时。这显然覆盖了Malloc的某些内部数据,因此当您以后realloc时,它认为指针是无效的...

a->data = (int *)calloc(capacity,capacity * sizeof(int));

第二个摆动器是错误的;您应该删除容量,仅使用sizeof(int)

a->data = (int*) calloc(capacity, sizeof(int));

最新更新