C-释放数组时检测到堆损坏

问题描述 投票:0回答:1

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

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);
}
heap corruption
1个回答
0
投票

[释放内存时,Windows还将检查并查看是否已写入数组末尾。自从这样做以来,它会抛出此异常,以使您知道自己有一个错误。

 char phone[12]; 

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.