在C中,无法释放并为char指针分配NULL

时间:2017-10-22 03:36:34

标签: c segmentation-fault malloc

在下面,我试图在使用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;
}

2 个答案:

答案 0 :(得分:7)

执行此操作时:

str2=str1;

您没有将str1指向的字符串复制到str2指向的内存位置。你正在做的是复制str1,即字符串常量"hello world"的地址,并将其分配给str2,覆盖{返回的值} {1}}。

然后,您尝试在malloc上调用freestr2现在包含字符串常量"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),并且您有内存泄漏。你现在使用的内存无法访问。