C-无法正确释放另一个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] = '';
    }
    for(i = 0; i < 4; i++)
        RESERV[i]="Iambananananananananananana";
    for(i = 0; i < 4; i++)
        printf("rn>%i<", RESERV[i]);
    for(i = 0; i < 4; i++)
    {
        printf("rn<%i>", (RESERV[i]));
        free(RESERV[i]);
    }
    free(RESERV);
}

此代码free()在32位工作正常,但以某种方式以64位模式崩溃。

在我的主要程序中,我省略了释放char**成员时时不时引起不可辩护的行为的成员,我显然不想要。

我尝试玩地址和指针,甚至尝试了

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

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

在您的代码

 RESERV[i]="Iambananananananananananana";

创建问题。覆盖malloc()分配的内存。因此,

  1. 您将面临内存泄漏,因为malloc() ED指针是 Lost
  2. 您无法用更改的指针调用free()。它调用了未定义的行为。

解决方案:

C中,您不分配 strings ,而是可以使用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;

相关内容

  • 没有找到相关文章

最新更新