c语言中的可用内存

c语言中的可用内存,c,memory,malloc,C,Memory,Malloc,我怀疑: void *a = malloc(40); free(a); 如果我认为MALOC(40)分配40字节的内存并返回这个内存的地址,然后自由(a)释放/释放这个内存,但是对内存中中的位模式没有任何作用。所以,假设这个相同的内存被分配给void*b,那么在打印b指向的地址的值时,它会给我一个与驻留的地址相同的值,或者它会给我一个垃圾值,为什么?它可以给你任何值。 C/C++标准并不要求值是任何特定的。在技术术语中,任何未初始化变量/内存的值都是不确定的 简言之,您的程序不应依赖此值来实现

我怀疑:

void *a = malloc(40);
free(a);

如果我认为MALOC(40)分配40字节的内存并返回这个内存的地址,然后自由(a)释放/释放这个内存<强>,但是对内存中<或强>中的位模式没有任何作用。所以,假设这个相同的内存被分配给void*b,那么在打印b指向的地址的值时,它会给我一个与驻留的地址相同的值,或者它会给我一个垃圾值,为什么?

它可以给你任何值。
C/C++标准并不要求值是任何特定的。在技术术语中,任何未初始化变量/内存的值都是不确定的


简言之,您的程序不应依赖此值来实现任何特定的功能,如果依赖此值,则它是不可移植的。

它可以为您提供任何值。
C/C++标准并不要求值是任何特定的。在技术术语中,任何未初始化变量/内存的值都是不确定的


简言之,您的程序不应依赖此值来实现任何特定功能,如果它依赖此值,则它是不可移植的。

我假设您考虑到了这种情况:

void * a = malloc(40);
free(a);
void * b = malloc(40);

assert(a == b);
这当然是完全合理的,因为内存很可能被重用

但是,由于
a==b
,您已经回答了自己的问题:
b
的值与
a
的值相同


我相信你问错了问题,你实际上对比较
b
所指的内存感兴趣。那完全是另一回事了。在两次
malloc
调用之间可能发生了任何事情。什么都不能保证。
malloc
调用的返回值指向的内存未初始化,您无法对其内容进行任何假设。显然,在一个典型的、优化过的C库中,内存不会发生变化,但这并不能保证。“安全”的运行时环境可能会选择使用特定的测试模式覆盖释放或分配的内存,以便更好地检测无效访问。

我假设您已经考虑到了这种情况:

void * a = malloc(40);
free(a);
void * b = malloc(40);

assert(a == b);
这当然是完全合理的,因为内存很可能被重用

但是,由于
a==b
,您已经回答了自己的问题:
b
的值与
a
的值相同


我相信你问错了问题,你实际上对比较
b
所指的内存感兴趣。那完全是另一回事了。在两次
malloc
调用之间可能发生了任何事情。什么都不能保证。
malloc
调用的返回值指向的内存未初始化,您无法对其内容进行任何假设。显然,在一个典型的、优化过的C库中,内存不会发生变化,但这并不能保证。“安全”的运行时环境可能会选择使用特定的测试模式覆盖释放或分配的内存,以便更好地检测无效访问。

这并不能保证任何事情。从malloc获得的打印块可以打印以前的数据,也可以不打印。有很多东西可以改变下一个malloc块(所以下一个地址将不同),或者也可以改变旧内存块本身。

这不能保证任何事情。从malloc获得的打印块可以打印以前的数据,也可以不打印。有很多东西可以改变下一个malloc块(因此下一个地址将不同),或者也可以改变旧内存块本身。

free通常会修改正在释放的内存

这是一个常见的技巧,尤其是在调试模式下,使用一些固定的模式来覆盖内存,以便更容易判断您是在双重释放内存,还是只是在操作释放的内存


类似地,malloc可能会用不同的模式覆盖内存,以表明内存未初始化。

free通常会修改正在释放的内存

这是一个常见的技巧,尤其是在调试模式下,使用一些固定的模式来覆盖内存,以便更容易判断您是在双重释放内存,还是只是在操作释放的内存


同样,MALLC可能会用不同的模式覆盖内存,以使其明显地显示内存未初始化。

Malc和FLUE是C风格的内存管理而不是C++。C++替代是新的和删除运算符。至于free()之后内存中剩余的位模式,是的,它是相同的位模式。如果您想手动删除位模式,如果您编写WiAPI代码,可以使用MeMSETE(或)0或0(C++)。C++替代是新的和删除运算符。至于free()之后内存中剩余的位模式,是的,它是相同的位模式。如果您想手动删除位模式,如果您编写WiAPI代码,可以使用MeMSET()或ZEMOMMORY()。首先,代码不是C++,而是C.< /P> 原因是,

free()
/
delete
存在,因此系统可以注意内存区域再次可供分配

它为什么还要做其他事情呢

然而,这是一个安全问题。我相信一些面向安全的现代系统在将内存分配给应用程序之前会将内存归零。然后,如果您第一次使用
malloc()
,您将获得一个等价的。即使如此,如果您碰巧释放了内存,然后再次分配它,您也可以读取自己的数据

这种行为的原因很简单。将内存归零将非常耗时,您可以手动完成。实际上它有
O(n)
复杂性。如果你编写了一个可以重用内存的数字处理器,你就不在乎在
malloc()
之后会得到什么,因为很可能你应该覆盖它,一个