释放导致崩溃

free'ing results in crash

有什么区别:

案例一:

    char* strings[100];
    strings[0]=malloc(100);
    char str[100]="AAA";
    strings[0]=strdup(str);
    free(strings[0]);

案例2:

    char* strings[100];
    strings[0]=malloc(100);
    strings[0]="AAA";
    free(strings[0]);

案例 2 导致崩溃。 strdupmalloc 之后的 strcpy 一样好。为什么第二种情况会崩溃?

strings[0]="AAA"; 不会将内容 AAA 复制到 string[0] 指向的内存中,而是让 strings[0] 指向字符串文字 "AAAA";释放字符串文字是未定义的行为,因为您正在释放之前未通过 malloc 分配的内存。请注意,一旦语句 strings[0]="AAA" 被执行,您将失去对之前 malloced 内存的任何访问权限。

要将内容复制到 malloced 内存中,请写入 strcpy(strings[0],"AAA")。那么free应该就没有问题了。

strings[0]=malloc(100);

这里strings[0]是指向新分配内存的指针。然而,然后,您执行 strings[0]="AAA"; 导致它指向 "AAA",read-only 内存中的一个字符串。您分配的内存现在已泄漏。然后你尝试释放 "AAA",你不能这样做,因为那是 read-only 内存。

在第一个片段中,它起作用了,因为你释放了被欺骗的内存,但你仍然在泄漏 malloc 分配的内存。

它会崩溃只是因为当您尝试释放一个未指向可以释放的内存的指针时(通常,行为是未定义的)会发生。在此处阅读有关字符串文字的更多信息:

而且您的两个示例都写得非常糟糕,因为 malloc 从未被使用过。

char* strings[100];
strings[0]=malloc(100);
char str[100]="AAA";
strings[0]=strdup(str);
free(strings[0]); 

等同于

char* strings[100];
char str[100]="AAA";
strings[0]=strdup(str);
free(strings[0]);

char* strings[100];
strings[0]=malloc(100);
strings[0]="AAA";
free(strings[0]);

相当于

char* strings[100];
strings[0]="AAA";
free(strings[0]);

请注意 "equivalent" 并非 100% 正确,因为您有副作用。我只是想表明有些行完全没有意义,因为您在重新分配变量之前不使用结果。