Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,无法将NULL释放并分配给字符指针_C_Segmentation Fault_Malloc - Fatal编程技术网

在C语言中,无法将NULL释放并分配给字符指针

在C语言中,无法将NULL释放并分配给字符指针,c,segmentation-fault,malloc,C,Segmentation Fault,Malloc,在下面的例子中,我试图在使用malloc()分配的内存后释放并清空char*。请帮我找出根本原因 #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

在下面的例子中,我试图在使用malloc()分配的内存后释放并清空char*。请帮我找出根本原因

#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;
}
执行此操作时:

str2=str1;
您没有将由
str1
指向的字符串复制到由
str2
指向的内存位置。您所做的是复制
str1
的值,即字符串常量
“hello world”
的地址,并将其分配给
str2
,覆盖
malloc
返回的值

然后尝试调用
str2
上的
free
,现在它包含字符串常量
“hello world”
的地址。这不是由
malloc
返回的地址,因此您需要调用它,在本例中它显示为崩溃

要复制字符串,请使用
strcpy
函数:

strcpy(str2, str1);
这将把字符串
str1
中的字符复制到
str2
指向的内存位置。当您执行以下操作时,您可以安全地呼叫免费(str2)

str2=str1;
您没有将由
str1
指向的字符串复制到由
str2
指向的内存位置。您所做的是复制
str1
的值,即字符串常量
“hello world”
的地址,并将其分配给
str2
,覆盖
malloc
返回的值

然后尝试调用
str2
上的
free
,现在它包含字符串常量
“hello world”
的地址。这不是由
malloc
返回的地址,因此您需要调用它,在本例中它显示为崩溃

要复制字符串,请使用
strcpy
函数:

strcpy(str2, str1);

这将把字符串
str1
中的字符复制到
str2
指向的内存位置。然后,当您执行str2=str1时,您可以安全地调用
free(str2)

,然后str2现在指向“hello world”字符串,而不是指向您调用的内存。该命令不会复制字符串,而只是更改str2指向的位置。您正试图释放系统分配的内存(而不是malloc),内存泄漏。现在无法访问您malloced的内存。

执行str2=str1时,str2现在指向“hello world”字符串,而不是您malloced的内存。该命令不会复制字符串,而只是更改str2指向的位置。您正试图释放系统分配的内存(而不是malloc),内存泄漏。您malloce的内存现在无法访问。

如果继续
str2=str1?如果你想复制字符串,请使用strcpy。嗨,我正在摆弄字符串来理解这些概念。我同意str2=str1。这是众多解决方案之一。我想理解,为什么在上述情况下内存的释放不起作用。您能帮助我吗?分配
str2=str1
不会将
str1
指向的字符串复制到
str2
指向的空间中。它所做的只是将str2更改为指向str1所指向的同一个thjing,因此它们都指向同一个存储器。因此,
malloc
返回的存储将丢失(因此这是内存泄漏),并且正如预期的那样,
free
调用失败。用strcpy(str2,str1)
替换str2=str1顺便说一句,
*sizeof(char)
是不必要的,因为从本质上讲,sizeof(char)总是一个。如果你接着转到
str2=str1,malloc有什么意义?如果你想复制字符串,请使用strcpy。嗨,我正在摆弄字符串来理解这些概念。我同意str2=str1。这是众多解决方案之一。我想理解,为什么在上述情况下内存的释放不起作用。您能帮助我吗?分配
str2=str1
不会将
str1
指向的字符串复制到
str2
指向的空间中。它所做的只是将str2更改为指向str1所指向的同一个thjing,因此它们都指向同一个存储器。因此,
malloc
返回的存储将丢失(因此这是内存泄漏),并且正如预期的那样,
free
调用失败。只要用strcpy(str2,str1)
替换
str2=str1
,顺便说一下,
*sizeof(char)
从来都不是必需的,因为
sizeof(char)
本质上总是一个。或者,许多系统都有
strdup
用于复制字符串。或者,如果没有,您可以自己滚动:或者,许多系统都有用于复制字符串的
strdup
。或者,如果他们不这样做,你可以自己滚: