C 动态分配的函数中的局部指针变量会发生什么变化?

C 动态分配的函数中的局部指针变量会发生什么变化?,c,pointers,malloc,global-variables,C,Pointers,Malloc,Global Variables,我很想知道如果在函数中声明一个int指针,然后使用malloc动态分配它会发生什么 void testing(){ int *p = malloc(sizeof(int)); *p = 5; } 即使在函数完成执行后指针被销毁,数据(本例中为5)是否仍存在于堆中 即使 指针被破坏了 是的,这叫做内存泄漏。您分配了内存并将其引用存储在指针p中,当p被销毁时,您只丢失了对已分配内存的引用,从而导致内存泄漏。使用malloc()或calloc()分配的内存不会自动释放。您必须显式调用fr

我很想知道如果在函数中声明一个int指针,然后使用malloc动态分配它会发生什么

void testing(){
   int *p = malloc(sizeof(int));
   *p = 5;
}
即使在函数完成执行后指针被销毁,数据(本例中为5)是否仍存在于堆中

即使 指针被破坏了


是的,这叫做内存泄漏。您分配了内存并将其引用存储在指针
p
中,当
p
被销毁时,您只丢失了对已分配内存的引用,从而导致内存泄漏。

使用
malloc()
calloc()
分配的内存不会自动释放。您必须显式调用
free()
,以取消分配内存

// Allocate
int* p = (int*)malloc(10 * sizeof(int)); 

// De-allocate
free(p);
在这个函数中

void testing(){
   int *p = malloc(sizeof(int));
   *p = 5;
}
局部变量(指针)
p
具有自动存储持续时间

对于没有可变长度数组类型的对象, 它的生存期从进入它所在的块开始 直到该块的执行以任何方式结束为止 标准)

使用malloc占用分配内存的对象具有分配的内存持续时间

已分配对象的生存期从分配到 解除分配。(C标准)


因此,由于内存没有显式释放,因此对象的生存期将一直延长,直到程序完成。您无法访问对象或重用分配的内存,因为在退出函数后,存储在局部变量
p
中的对象地址丢失。这种情况会导致内存泄漏。

“存储[…]其引用”更好的说法是“存储其地址”。虽然“引用”在C中不存在,但它们在C++中是不同的,并且C和C++是表兄弟,这可能会引起混淆。非常感谢。