在下面,我试图在使用malloc()分配的内存后释放并对char *进行NULL化。请帮我确定根本原因。
int qsort_cmp_str(const void *a, const void *b)
{
const char *s1 = a;
const char *s2 = b;
return strcmp(s1, s2);
}
-
错误是:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
char *str1="hello world";
char *str2=malloc((strlen(str1)+1) * sizeof(char));
str2=str1;
printf("%s",str2);
free(str2);
str2=NULL;
}
答案 0 :(得分:7)
执行此操作时:
str2=str1;
您没有将str1
指向的字符串复制到str2
指向的内存位置。你正在做的是复制str1
的值,即字符串常量"hello world"
的地址,并将其分配给str2
,覆盖{返回的值} {1}}。
然后,您尝试在malloc
上调用free
,str2
现在包含字符串常量"hello world"
的地址。这不是malloc
返回的地址,因此您调用undefined behavior,在这种情况下会显示为崩溃。
要复制字符串,请使用strcpy
功能:
strcpy(str2, str1);
这会将字符串str1
中的字符复制到str2
指向的内存位置。然后,您可以安全地拨打free(str2)
。
答案 1 :(得分:1)
当你执行str2 = str1时,str2现在指向&#34; hello world&#34;字符串,而不是你malloced的内存。该命令不会复制字符串,只是更改str2指向的位置。您正在尝试释放由系统分配的内存(而不是malloc),并且您有内存泄漏。你现在使用的内存无法访问。