我正在尝试在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));