【问题标题】:C - Heap Corruption Detected when freeing arrayC - 释放数组时检测到堆损坏
【发布时间】:2020-10-02 23:23:33
【问题描述】:

进行赋值,必须动态分配指针数组,然后在函数结束时释放它。 问题是当我释放阵列时,它给了我一个“检测到堆损坏”错误,我无法弄清楚为什么会发生这种情况。 有人可以在这里看到什么吗? 它说我在分配的内存结束后写,但我不明白为什么。

typedef struct _client
{
    char id[9];         
    char phone[12]; 
} Client;

Short_client *createShortClientArr(int n)
{
    Client *arr = (Client *)malloc(n * sizeof(Client));
    char garbage;
    garbage = getc(stdin);//for getting the '\n' from the last input
    for (int i = 0; i < n; i++)
    {
        fgets(arr[i].id, 9, stdin);
        arr[i].id[9] = '\0';
        garbage = getc(stdin);
        fgets(arr[i].phone, 12, stdin);
        arr[i].phone[12] = '\0';
        garbage = getc(stdin);
    }
free(arr);
}

【问题讨论】:

  • 当你释放内存时,Windows 也会检查你是否写到了数组的末尾。既然你这样做了,它就会抛出这个异常,让你知道你有一个错误。

标签: heap-corruption


【解决方案1】:

当你释放内存时,Windows 也会检查你是否写到了数组的末尾。既然你这样做了,它就会抛出这个异常,让你知道你有一个错误。

 char phone[12]; 

这将创建一个索引为 0-11 的数组。

    arr[i].phone[12] = '\0';

12 不是此数组的有效索引,因此这会将'\0' 写入数组末尾的char。你的其他数组也有同样的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 2018-03-26
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多