无法正确释放另一个 malloc 的 malloc

Unable to properly free malloc of another malloc

这是有问题的片段。

int main()
{
    char** RESERV = (char**)malloc(sizeof(char*)*4);
    printf("%i, %i, %i, %i, %i", **RESERV, *RESERV, RESERV, &**RESERV, sizeof(char*));
    int i;
    for(i = 0; i < 4; i++)
    {
        RESERV[i] = (char*)calloc(sizeof(char),16);
        RESERV[i][15] = '[=10=]';
    }
    for(i = 0; i < 4; i++)
        RESERV[i]="Iambananananananananananana";
    for(i = 0; i < 4; i++)
        printf("\r\n>%i<", RESERV[i]);
    for(i = 0; i < 4; i++)
    {
        printf("\r\n<%i>", (RESERV[i]));
        free(RESERV[i]);
    }
    free(RESERV);
}

此代码 free() 在 32 位模式下运行良好,但在 64 位模式下会以某种方式严重崩溃。

在我的主程序中,我忽略了释放 char** 的成员时不时地导致意外行为,这显然是我不希望的。

我尝试过使用地址和指针,甚至尝试过

free(RESERV+(i*sizeof(char*))

也失败了。有人可以澄清我做错了什么吗?

在你的代码中

 RESERV[i]="Iambananananananananananana";

造成问题。它 覆盖 malloc() 分配的内存。因此,

  1. 您面临内存泄漏,因为 malloc()ed 指针丢失
  2. 您不能使用更改后的指针调用 free()。它调用 undefined behaviour.

解法:

C 中,您不分配 字符串 ,相反,您可以使用 strcpy() 来完成您的工作。

备注:

  1. 即使 strcpy() 也不能使用 "Iambananananananananananana"。在这种情况下,它会造成内存溢出,因为目标没有足够的内存来完全容纳它。

  2. 使用正确的格式说明符。在您的 printf() 语句中,%i 的大部分参数都不是 int 类型。对于指针类型参数,您至少应该使用 %p。否则就是UB。

RESERV[i]="Iambananananananananananana";

这不是分配后填充此字符串的正确方法。您正在覆盖该指针的值。

strncpy(RESERV[i], "Iambananananananananananana", 15);
RESERV[i][15] = 0;

这就是您要找的。

另请注意,您显然要向该指针分配的内容大于您分配的内存。

 RESERV[i]="Iambananananananananananana";

不正确 - 你需要做

 strncpy(RESERV[i], "Iambananananananananananana", 15);
 RESERVp[i][15] = 0;