如何在C中释放char*
所以我读了一些类的代码,我对变量在C中是如何分配的有点困惑 给出的代码是如何在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",
#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
)。所有其他类型的内存(如静态或自动)永远不归您所有,这意味着释放