这似乎在调试器中重新分配(至少它不会陷入错误状态)。当我打电话给免费电话时,它会大喊“检测到堆腐败!"知道为什么吗?
int arri_init(ARRAY_INT *a, const int intSize)
{
a->array = NULL;
a->size = 0;
a->array = (int *)malloc(sizeof(int) * intSize);
if (a->array == NULL)
return FALSE;
a->size = intSize;
return TRUE;
}
int arri_resize(ARRAY_INT *a, const int intNewSize)
{
int *temp = NULL;
// Get a temporary variable
temp = a->array;
// Reallocate array
a->array = (int *)realloc(a->array, intNewSize);
if (a->array == NULL)
{
a->array = temp;
return FALSE;
}
a->size = intNewSize;
return TRUE;
}
void arri_release(ARRAY_INT *a)
{
if (a->array)
{
free(a->array);
a->array = NULL;
}
}
//主要代码
int main(void)
{
ARRAY_INT a;
arri_init(&a, 10);
arri_resize(&a, 20);
a.array[13] = 5;
printf("%d\n", a.array[13]);
arri_release(&a);
return 0;
}
答案 0 :(得分:2)
您最初使用a->array
分配sizeof(int) * intSize
,但是当您调整数组大小时,仅使用intNewSize
重新分配它,这意味着您的重新分配大小将会减少{ {1}}。相反,它应该是sizeof(int)
在realloc(a->array, sizeof(int) * intNewSize)
方法中,main
调用将导致重新分配仅20个字节,这只是5个整数(假设为32位整数)。因此,当您写入索引编号13时,您将直接射到阵列存储空间的末尾。