因此,当使用未定义(但声明)的变量时,每次都包含奇怪的值。它有这样的价值吗?它是故意随机生成的吗?
答案 0 :(得分:3)
它不是随机生成的,只是残留记忆。
每次清除所有未使用的内存效率非常低。因此内存被释放到操作系统并可用。当你请求新的内存时,你得到一些内存,这个内存不属于任何人,但仍然有垃圾,因为它刚被释放,但没有被清除。
答案 1 :(得分:2)
C不会清理它分配的内存。这些值是内存中分配位置的“剩余”。
C作为一项原则并不是隐藏程序员的操作。它只会提出要求。因为你没有要求初始化变量,它不会为你做,所以在目标内存中“向上/向下”的相同位不会改变。
答案 2 :(得分:2)
变量可以有未定义的值以避免使用一些合理的值进行初始化的开销,因此它绝对不是随机生成的(这本身就是非常重要的操作)。最初保持的值变量恰好是当时变量的内存位置。
答案 3 :(得分:2)
当声明局部变量时,编译器在封闭函数的堆栈帧中分配一个插槽,变量将存在于该帧中。在设置堆栈帧之前,内存中特定位置的值是什么(通常来自前一个函数调用,该堆栈帧占用该空间)成为该变量的初始内容。
在某些情况下,未初始化的变量实际上是故意设置为某个值,但它很少是随机的。例如,调试malloc()
可能会将新分配的块的每个字设置为0xbadf00d,以作为未分配内存的标记。因此,struct成员可能会被初始化为以前的其他内容。我不知道任何为堆栈变量执行此操作的编译器,但它们可能存在。
答案 4 :(得分:1)
c中未初始化值的值取决于存储器地址中存储的值。它不是故意随机的。
答案 5 :(得分:1)
每当你声明一个变量时,它就会有一个内存空间来保存它的值。如果未明确设置任何内容,则它将包含先前存储在该位置的任何值。因此,它不是由程序有目的地随机生成的,只是恰好存在的值。
答案 6 :(得分:1)
变量声明表示编译器说有一个这样的变量类型。变量的定义为此分配内存。分配的内存可以是stack
(auto
变量),heap
(动态分配的内存)等等。除非它是static
变量,否则将分配内存来自未初始化的数据段。因此,您看到的随机值只不过是之前存储在该内存位置的值!因此建议在使用它们之前初始化变量(第一次),或者换句话说,不要使用/取消引用未初始化的变量/指针。
有关内存中程序结构的更多信息,请参见here。
希望它有所帮助!