我知道如果一个指针在C中声明(并且没有初始化),它将指向一个“随机”的内存地址,它可以包含任何内容。
虽然它确实指向了哪里?据推测,这并不是真正随机的,因为这样效率低且不合逻辑。
答案 0 :(得分:4)
如果此指针在所有函数之外定义(或static
),则会在NULL
获得控制权之前将其初始化为main()
。
如果通过malloc(sizeof(sometype*))
在堆中创建此指针,它将包含在其位置发生的任何事情。它可以是来自先前分配和释放的内存缓冲区的数据。或者它可以是malloc()
和free()
用来管理空闲和已分配块列表的一些旧控制信息。或者,如果操作系统(如果有的话)没有清除程序的内存或者系统调用内存分配返回未初始化的内存,那么它可能是垃圾,因此它们可能包含来自先前运行的程序的代码/数据,或者只是RAM芯片具有的一些垃圾。系统已启动。
如果此指针对于函数是本地的(并且不是static
),则它将包含堆栈上的任何位置。或者,如果CPU寄存器被分配给该指针而不是存储器单元,它将包含前面指令在该寄存器中留下的任何值。
所以,它不会完全随机,但你很少有完全的控制权。
答案 1 :(得分:3)
未初始化未定义。一般来说,当分配指针时,内存空间不会被清除,所以无论内存中包含什么,现在都是一个指针。它是随机的,但在操作中没有改变内存位置的意义上它也是有效的。
答案 2 :(得分:2)
http://en.wikipedia.org/wiki/Uninitialized_variable
C等语言使用变量的堆栈空间和集合 为子程序分配的变量称为堆栈帧。 而计算机将留出适当的空间 堆栈框架,它通常只需通过调整值来实现 堆栈指针,并没有将内存本身设置为任何新状态 (通常出于效率问题)。因此,无论内容如何 当时的那个记忆将作为初始值出现 占据这些地址的变量。
虽然我认为这是特定于实现的。
此外,您可能应该始终初始化指针,请参阅How do you check for an invalid pointer?提供的答案以及第一个答案中给出的链接: -
答案 3 :(得分:1)
就C标准而言,未初始化的指针不会将指向。取消引用它是非法的。因此,原则上不可能观察其目标,因此对于所有意图和目的而言,目标不存在。
如果你想要一个类似的类比,要求未初始化指针的值就像要求最小正实数的值,或π的最后一位数的值。
(同一个角色是只有查克诺里斯可以取消引用一个未初始化的指针。)
答案 4 :(得分:0)
这是特定于实现/未定义的行为。指针可能会自动初始化为NULL ...或者它只是当时内存中的任何值。
指针是内存中指向内存中另一个地址的地址。它未初始化的事实并不意味着指针本身没有地址,它只意味着它指向的东西的地址是未知的。因此,编译器默认将其初始化为NULL,或者地址是当时指针变量空间中的内存。
答案 5 :(得分:0)
在很大程度上,当你进入课堂时,它就像一张没有擦过的白板。如果你在电路板的一部分上画一个盒子但是没有擦除盒子里的东西,那么盒子里有什么东西?
这是以前留下的任何东西。
同样,如果为指针分配空间但不删除空格,那么空间中的内容是什么?
数据可能会从程序的早期部分或在程序的任何正常部分(例如main
函数)开始运行之前运行的特殊代码中遗留下来。 (特殊代码可以加载和链接某些库,设置堆栈,以及以其他方式准备C程序所需的环境。)在嵌入式系统上,而不是典型的多用户系统,数据可能会从以前的进程中遗留下来。很可能,之前使用的空间是指针之外的其他东西,所以当它被解释为指针时,它的值是没有意义的。它作为指针的值可能指向某个地方,但在任何方面都没有意义。
但是,您不能依赖于此。当您使用具有自动存储持续时间的未初始化对象时,C标准不会定义行为。在许多C实现中,未初始化的指针将仅包含剩余数据。但是,在某些C实现中,系统可能会检测到您正在使用未初始化的对象并导致程序崩溃。 (其他行为也是可能的。)