0

我有一个问题要问,这是在阅读静态变量的概念时发生的。如果我在一个函数中创建一个分配的内存块,使用malloc,然后函数返回到main,而没有使用free()分配的内存,那么该内存块是否容易在程序过程中发生变化?我的意思是,在我离开函数之后,内存块可能会被另一个进程覆盖,而我想以我的方式使用它和/或编辑它,或者它是否被类似的东西“锁定”,直到我免费吗?在我释放之前,是否可以将该块视为没有数据?

4

5 回答 5

2

一旦您malloc编辑了一定数量的字节,除非您明确说明,否则free它将在您的程序的整个生命周期中一直存在。

无论您在哪个函数中执行了,只要您有一个指向ed 内存malloc的有效指针,该内存将是活跃的,您可以在程序中的任何地方使用。malloc

于 2012-10-25T12:18:33.213 回答
1

C 标准指定了一个称为已分配的存储持续时间(在 C99 6.2.4 对象的存储持续时间中)。分配存储的生命周期是从分配(使用 malloc、calloc、realloc)到释放(使用 free 或 realloc)。所以,是的,从函数返回不会使分配的存储无效(与局部变量等自动存储不同)。您可以期望它仍然被分配。只要您有指向此类存储的有效指针,您就可以读取和写入它。

于 2012-10-25T13:05:51.797 回答
1

当使用 malloc 分配内存时,只要您的程序正在运行并且只要您不释放此内存块,它就会一直分配给您的程序。所以这个内存块不能被另一个进程修改或覆盖。

于 2012-10-25T13:47:12.323 回答
1

通常,分配的内存块不能被另一个进程覆盖,因为这两个进程驻留在两个不同的虚拟地址空间中,除非您以某种方式与另一个进程共享内存

于 2012-10-25T14:18:16.013 回答
0

好的,所以我想您是在问在这种情况下会发生什么...

#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。因此,任何后续代码最终写入块的唯一方法是“意外”通过某种方式获得一个指向恰好位于块内存中的位置的指针(可能是由于某种代码错误),然后写入它。

于 2012-10-25T12:40:24.000 回答