由malloc创建的内存块的保留

由malloc创建的内存块的保留,c,memory,malloc,free,memory-corruption,C,Memory,Malloc,Free,Memory Corruption,我有一个问题要问,这是在阅读静态变量的概念时发生的。如果我使用malloc在函数中创建一个分配的内存块,然后函数返回到main,而没有在分配的内存上使用free(),那么该内存块是否会在程序运行过程中受到更改的影响?我的意思是,在我离开这个函数之后,当我想用我的方式使用它和/或编辑它时,内存块是否可能被另一个进程覆盖,或者在我释放它之前它是否被“锁定”了?在我释放块之前,它是否可能被视为没有数据?一旦你malloc释放了一定数量的字节,除非你明确地释放它,否则它将在程序的整个生命周期内保持活动状

我有一个问题要问,这是在阅读静态变量的概念时发生的。如果我使用
malloc
在函数中创建一个分配的内存块,然后函数返回到
main
,而没有在分配的内存上使用
free()
,那么该内存块是否会在程序运行过程中受到更改的影响?我的意思是,在我离开这个函数之后,当我想用我的方式使用它和/或编辑它时,内存块是否可能被另一个进程覆盖,或者在我释放它之前它是否被“锁定”了?在我释放块之前,它是否可能被视为没有数据?

一旦你
malloc
释放了一定数量的字节,除非你明确地
释放它,否则它将在程序的整个生命周期内保持活动状态


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

一旦
malloc
读取了一定数量的字节,除非您显式地
释放它,否则它将在程序的整个生命周期中保持活动状态


无论您在哪个函数中执行了
malloc
,只要您有一个指向
malloc
ed内存的有效指针,内存都将处于活动状态,您可以在程序中的任何位置使用。

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

#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...
}
#包括
void myfunc(void)
{
静态空隙*p=malloc(块大小);
//也许此函数的其余部分使用指向已分配内存的指针。。。
}
int main(int argc,字符**argv)
{
myfunc();
//程序的其余部分在这里。。。
}
。。。询问“程序的其余部分”代码是否可以写入由
myfunc()
分配的内存块

堆仍然会分配内存,因为它不知道只有
myfunc()
中的代码保存指向内存块的指针。但它也不会“锁定”它(即保护它不被写入——C语言本身没有这样的概念)


由于堆仍将内存块视为已分配,因此使用后续
malloc()
的代码不会获得指向已分配内存块的指针。而
myfunc()
之外的任何代码都不会知道指针
p
的值。因此,任何后续代码最终写入块的唯一方法是“意外地”获取一个指向块内存中某个位置的指针(可能是由于某种代码错误),然后写入该位置。

好的,我想你是在问在这种情况下会发生什么

#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...
}
#包括
void myfunc(void)
{
静态空隙*p=malloc(块大小);
//也许此函数的其余部分使用指向已分配内存的指针。。。
}
int main(int argc,字符**argv)
{
myfunc();
//程序的其余部分在这里。。。
}
。。。询问“程序的其余部分”代码是否可以写入由
myfunc()
分配的内存块

堆仍然会分配内存,因为它不知道只有
myfunc()
中的代码保存指向内存块的指针。但它也不会“锁定”它(即保护它不被写入——C语言本身没有这样的概念)


由于堆仍将内存块视为已分配,因此使用后续
malloc()
的代码不会获得指向已分配内存块的指针。而
myfunc()
之外的任何代码都不会知道指针
p
的值。因此,任何后续代码最终写入块的唯一方法是“意外地”获取一个指向块内存中某个位置的指针(可能是由于某种代码错误),然后写入该位置。

C标准指定了一个名为已分配的存储持续时间(在C99 6.2.4对象的存储持续时间中)分配的存储的生存期是从分配(使用malloc、calloc、realloc)到解除分配(使用free或realloc)。因此,是的,从函数返回不会使分配的存储失效(不像自动类似存储的局部变量)。您可以期望它仍然被分配。只要您有一个指向此类存储的有效指针,您就可以读写它。

C标准指定了一个名为已分配的存储持续时间(在C99 6.2.4对象的存储持续时间中)。已分配存储的生存期来自分配(使用malloc、calloc、realloc)直到解除分配(使用free或realloc)。因此,是的,从函数返回不会使分配的存储失效(与类似于本地变量的存储不同)。您可以期望它仍然被分配。并且只要您有指向此类存储的有效指针,您就可以读取和写入它。

当使用malloc分配内存时,只要您的程序正在运行并且您没有释放此内存块,它就会一直被分配给您的程序。因此,此内存块不能被另一个进程。

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

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

通常,malloced内存块不能被另一个进程覆盖,因为这两个进程驻留在两个不同的虚拟地址空间中,