释放导致崩溃

时间:2019-06-07 06:21:38

标签: c free strdup

两者之间有什么区别

案例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导致崩溃。 strdupmalloc相同,后跟strcpy。为什么第二种情况会崩溃?

3 个答案:

答案 0 :(得分:4)

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

要将内容复制到malloc化的存储器中,请写入strcpy(strings[0],"AAA")。那么free应该再没问题了。

答案 1 :(得分: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%正确,因为您有副作用。我只是想表明某些行是完全没有意义的,因为在重新分配变量之前您不使用结果。

答案 2 :(得分:1)

strings[0]=malloc(100);

这里strings[0]是指向新分配的内存的指针。但是,然后执行strings[0]="AAA";使其指向"AAA",即只读存储器中的字符串。您分配的内存现已泄漏。然后,您尝试释放"AAA",这是只读存储器,因此无法执行。

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