【发布时间】:2012-01-09 09:10:32
【问题描述】:
因此,当使用未定义(但已声明)的变量时,它每次都包含奇怪的值。它怎么会有这样的价值?是故意随机生成的吗?
【问题讨论】:
因此,当使用未定义(但已声明)的变量时,它每次都包含奇怪的值。它怎么会有这样的价值?是故意随机生成的吗?
【问题讨论】:
不是随机产生的,只是残存的记忆。
每次都清除所有未使用的内存是非常低效的。因此内存被释放到操作系统并可用。当您请求新内存时,您会获得一些不属于任何人的内存,但由于它刚刚被释放但未清除,因此其中仍有垃圾。
【讨论】:
当声明局部变量时,编译器会在封闭函数的堆栈帧中分配一个槽,该变量将存在于其中。在设置堆栈帧之前,内存中该特定位置的任何值(通常来自堆栈帧占用该空间的先前函数调用)都将成为该变量的初始内容。
在某些情况下,未初始化的变量实际上是故意设置为某个值,但它很少是随机的。例如,调试malloc() 可能会将新分配的块的每个字设置为 0xbadf00d,以作为内存尚未分配的标记。因此,结构成员可能会被初始化为不同于以前的任何东西。我不知道有任何编译器对堆栈变量执行此操作,但它们可能存在。
【讨论】:
0xbadf00d?很高兴知道像这样使用十六进制。
C 没有清理它分配的内存。这些值是内存中分配位置的“剩余”。
C 原则上不会对程序员隐藏操作。它只执行要求的操作。由于您没有要求初始化变量,因此它不会为您执行此操作,因此目标内存中“向上”/“向下”的相同位 - 不要更改。
【讨论】:
变量可以有未定义的值,以避免使用一些合理的值进行初始化的开销,所以它绝对不是随机生成的(这本身就是不平凡的操作)。最初保存的值变量正是当时恰好在变量的内存位置中的值。
【讨论】:
c 中未初始化值的值取决于存储在内存地址中的值。它不是故意随机的。
【讨论】:
当你声明一个变量时,它已经有一个内存空间来保存它的值。如果您没有明确设置任何内容,它将包含之前存储在该位置的任何值。所以它不是程序故意随机生成的,只是碰巧存在的值。
【讨论】:
变量的声明是向编译器表明存在一个这样的某某类型的变量。变量的定义为此分配内存。分配的内存可以是stack(auto 变量)、heap(动态分配的内存)等任何地方。除非它是static 变量,否则它将从未初始化的数据段中分配内存。因此,您看到的随机值只不过是之前存储在该内存位置的值!因此,建议在使用变量之前(第一次)初始化变量,或者换句话说,不要使用/取消引用未初始化的变量/指针。
有关内存中程序结构的更多信息,请参阅here。
希望对你有帮助!
【讨论】: