Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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中释放char*_C_String_Memory - Fatal编程技术网

如何在C中释放char*

如何在C中释放char*,c,string,memory,C,String,Memory,所以我读了一些类的代码,我对变量在C中是如何分配的有点困惑 给出的代码是 #include<stdio.h> main () { int n=0; char *p = "hello world"; while (*p!= 0) { // *p != '\0'; putc(*p, stdout); p++; } printf("\np = %d", *p); printf("\np = %d\n",

所以我读了一些类的代码,我对变量在C中是如何分配的有点困惑

给出的代码是

#include<stdio.h>
main () {
    int n=0; 
    char *p = "hello world";
    while (*p!= 0)  {   // *p != '\0';
        putc(*p, stdout);
        p++;
    }
    printf("\np = %d", *p);
    printf("\np = %d\n", p);
}
#包括
主要(){
int n=0;
char*p=“你好,世界”;
而(*p!=0){/*p!='\0';
putc(*p,stdout);
p++;
}
printf(“\np=%d”,*p);
printf(“\np=%d\n”,p);
}

所以我知道你不需要为char释放任何内存,因为没有malloc发生,但是我不明白为什么这个代码不会泄漏任何内存。。。如果您正在为字符串递增指针,从而将指针移动到下一个内存块(1字节),那么您是否会丢失初始引用以及递增的所有引用点?如果没有引用点,该内存将如何回收,除非编译器在此类操作发生之前保存了一个引用点。我希望您能了解这是如何回收的

您没有泄漏任何内存,因为您没有动态分配任何内存。内存泄漏源于未释放动态分配的内存。本地分配的内存(如
char*p
)或静态分配的内存(如
p
最初指向的字符串
“hello world”
)不会导致泄漏。

您没有动态分配任何新内存,因此不需要释放它

简而言之:因为程序本身很短。你可以在那里做任何你想做的
malloc
,实际上不会发生泄漏,因为所有的内存都会在进程结束后立即返回操作系统。在您的示例中,泄漏不是问题。反正

在您的情况下,不会发生泄漏,因为变量
p
指向一个文本字符串,该字符串位于内存的数据段中(即,它是一个常量,写在可执行文件中)。这种内存不能取消分配,因为它的空间是固定的。
实际上,这不是一个问题,这是错误的,因为一个非常大的可执行文件,其中有许多大常量,可能会有显著的内存占用,但无论如何这并不称为泄漏,因为内存使用量可能很大,但不会随时间增加,这是内存泄漏的主要原因(因此称为泄漏).

当您在本地声明变量时,编译器知道每个变量需要多少空间,当您运行程序时,每个本地变量(以及每个函数调用)都放在堆栈上。就在return语句(如果是void函数,则为}括号)之后,每个局部变量都会从堆栈中弹出,所以您不必释放它

当您调用new操作符(或纯C中的malloc)时,编译器不知道数据的大小,因此内存是在运行时在堆上分配的

我之所以要解释这一点,是因为无论何时调用new或malloc(或calloc),您都有责任释放不再使用的内存。

字符串literal
“hello world”
是程序本身的一部分。当计算
“hello world”
表达式时,程序实际上会获得指向自身某个部分的指针。程序运行时无法释放内存;这相当于在程序中打一个“洞”。内存与程序本身具有相同的生存期

在C语言中,程序员不需要管理与程序具有相同生存期的内存:它由启动程序的环境进行外部管理(或管理不当,视情况而定),并在程序终止时处理后果

当然,内存仍然需要管理;只是责任不在C程序。(至少,在一个提供C语言托管实现的环境中不是这样。某些嵌入式系统的规则可能不是这样!)


在嵌入式程序中,字符串文字(以及程序的其余部分)实际上可以存在于ROM中,因此可能真的没有什么需要清理的。指针是一个地址,表示一个芯片(或多个芯片)上的某个永久位置。

释放内存的任务强加给该内存的所有者。仅仅因为您有一个指向某个内存区域的指针,并不意味着您拥有该内存,因此也不意味着您要负责释放它

String literal
“hello world”
是一个具有静态存储持续时间的对象。它存储在静态存储器中。静态内存始终由运行时环境拥有。运行时环境知道存储在静态内存中的数据。运行时环境知道何时必须释放数据(这很容易,因为静态内存基本上是“从不”释放的——只要程序运行,它就存在)

所以,同样地,您的指针
p
在静态区域中并不真正拥有任何内存。您正好用
p
引用了该内存。您不必担心内存的释放。当时间到来时(即程序结束时),它将被正确地解除分配,并且它将在没有您和您的指针的任何帮助的情况下正确地完成。您可以随意更改
p
,也可以将其指向完全不同的内存位置,也可以毫无保留地丢弃它。非正式地说,没有人关心你的
p

在C程序中,您可能拥有的唯一内存是您个人使用
malloc
(或其他动态内存分配函数)分配的内存。因此,您必须记住最终为自己分配的内存调用
free
(并且您必须确保知道
malloc
返回的原始值以传递给该
free
)。所有其他类型的内存(如静态或自动)永远不归您所有,这意味着释放