为什么释放我的重新分配的数组在C中失败?

时间:2014-01-18 21:55:05

标签: c arrays

这似乎在调试器中重新分配(至少它不会陷入错误状态)。当我打电话给免费电话时,它会大喊“检测到堆腐败!"知道为什么吗?

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;
}

1 个答案:

答案 0 :(得分:2)

您最初使用a->array分配sizeof(int) * intSize,但是当您调整数组大小时,仅使用intNewSize重新分配它,这意味着您的重新分配大小将会减少{ {1}}。相反,它应该是sizeof(int)

realloc(a->array, sizeof(int) * intNewSize)方法中,main调用将导致重新分配仅20个字节,这只是5个整数(假设为32位整数)。因此,当您写入索引编号13时,您将直接射到阵列存储空间的末尾。