This question already has answers here:
Closed 4 years ago.
String assignment in C
(4个答案)
这是有问题的片段。
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] = '\0';
    }
    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);
}

这段代码在32位模式下运行良好,但在64位模式下崩溃得可怕。
在我的主程序中,我忽略了不时释放free()的成员,这会导致未被屏蔽的行为,这显然是我不想要的。
我试着玩弄地址和指针,甚至试过
free(RESERV+(i*sizeof(char*))

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

最佳答案

在你的代码中

 RESERV[i]="Iambananananananananananana";

造成问题。它覆盖malloc()分配的内存。因此,
您将面临内存泄漏,因为malloc()ed指针丢失。
不能用更改的指针调用free()。它调用undefined behaviour
解决方案:
C中,您不分配字符串,而是可以使用strcpy()完成工作。
笔记:
即使在strcpy()的情况下,也不能使用"Iambananananananananananana"。在这种情况下,它将创建内存溢出,因为目标没有足够的内存来完全容纳它。
使用正确的格式说明符。在printf()语句中,%i的大多数参数都不是int类型。对于指针类型参数,应至少使用%p。否则,它将是UB。

关于c - 无法正确释放另一个malloc的malloc ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30168843/

10-11 23:13
查看更多