我有一个问题要问,这是在阅读静态变量的概念时发生的。如果我在一个函数中创建一个分配的内存块,使用malloc
,然后函数返回到main
,而没有使用free()
分配的内存,那么该内存块是否容易在程序过程中发生变化?我的意思是,在我离开函数之后,内存块可能会被另一个进程覆盖,而我想以我的方式使用它和/或编辑它,或者它是否被类似的东西“锁定”,直到我免费吗?在我释放之前,是否可以将该块视为没有数据?
5 回答
一旦您malloc
编辑了一定数量的字节,除非您明确说明,否则free
它将在您的程序的整个生命周期中一直存在。
无论您在哪个函数中执行了,只要您有一个指向ed 内存malloc
的有效指针,该内存将是活跃的,您可以在程序中的任何地方使用。malloc
C 标准指定了一个称为已分配的存储持续时间(在 C99 6.2.4 对象的存储持续时间中)。分配存储的生命周期是从分配(使用 malloc、calloc、realloc)到释放(使用 free 或 realloc)。所以,是的,从函数返回不会使分配的存储无效(与局部变量等自动存储不同)。您可以期望它仍然被分配。只要您有指向此类存储的有效指针,您就可以读取和写入它。
当使用 malloc 分配内存时,只要您的程序正在运行并且只要您不释放此内存块,它就会一直分配给您的程序。所以这个内存块不能被另一个进程修改或覆盖。
通常,分配的内存块不能被另一个进程覆盖,因为这两个进程驻留在两个不同的虚拟地址空间中,除非您以某种方式与另一个进程共享内存块。
好的,所以我想您是在问在这种情况下会发生什么...
#include <stdlib.h>
void myfunc( void )
{
static void* p = malloc(BLOCK_SIZE);
// perhaps the rest of this function uses the pointer to the allocated mem...
}
int main( int argc, char** argv )
{
myfunc();
// the rest of the program goes here...
}
...并询问“程序的其余部分”代码是否可以写入由myfunc()
.
堆仍然会分配内存,因为它不知道只有其中的代码myfunc()
持有指向内存块的指针。但它也不会“锁定”它(即保护它不被写入——C 语言本身没有这样的概念。)
由于堆仍然认为内存块已分配,因此使用后续的代码malloc()
不会获得指向您已分配的块内的块的指针。并且外面的任何代码都myfunc()
不会知道指针的值p
。因此,任何后续代码最终写入块的唯一方法是“意外”通过某种方式获得一个指向恰好位于块内存中的位置的指针(可能是由于某种代码错误),然后写入它。