0

有什么区别:

情况1:

    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]);

Case2 导致崩溃。 和后面strdup一样好。为什么第二种情况会崩溃?mallocstrcpy

4

3 回答 3

4

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

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

于 2019-06-07T06:24:36.397 回答
2

它会崩溃只是因为当您尝试释放未指向可以释放的内存的指针时(通常,行为未定义)会发生这种情况。在此处阅读有关字符串文字的更多信息:https ://stackoverflow.com/a/1704433/6699433

而且你的两个例子都写得很糟糕,因为 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]);

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

于 2019-06-07T06:36:46.510 回答
1
strings[0]=malloc(100);

strings[0]是一个指向新分配内存的指针。但是,然后,您这样做strings[0]="AAA";会导致它指向"AAA"只读存储器中的字符串。您分配的内存现在已泄漏。然后你尝试释放"AAA",你不能这样做,因为那是只读内存。

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

于 2019-06-07T06:25:26.440 回答