两者之间有什么区别
案例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
与malloc
相同,后跟strcpy
。为什么第二种情况会崩溃?
答案 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
分配的内存。