c中未初始化指针指向的目标如何确定?

我知道如果一个指针在C中声明(并且没有初始化),它将指向一个可以包含任何内容的“随机”内存地址。

它实际上指向的地方怎么样? 据推测,这不是真正的随机,因为这将是低效和不合逻辑的。

如果此指针在所有函数之外定义(或者是static ),则在main()获得控制之前将其初始化为NULL

如果通过malloc(sizeof(sometype*))在堆中创建了这个指针,它将包含在其位置发生的任何事情。 它可以是来自先前分配和释放的内存缓冲区的数据。 或者它可以是malloc()free()用来管理空闲和已分配块列表的一些旧控制信息。 或者,如果操作系统(如果有的话)没有清除程序的内存或者系统调用内存分配返回未初始化的内存,那么它可能是垃圾,因此它们可能包含先前运行的程序中的代码/数据,或者只是RAM芯片具有的一些垃圾。系统已启动。

如果此指针对于函数是本地的(并且不是static ),则它将包含堆栈上其位置的任何内容。 或者,如果将CPU寄存器分配给该指针而不是存储器单元,则它将包含前面指令在该寄存器中留下的任何值。

所以,它不会完全随机,但你很少有完全控制。

未初始化未定义。 一般来说,当分配指针时,内存空间不会被清除,因此无论内存包含什么,现在都是指针。 它是随机的,但是在操作中没有改变存储器位置的意义上它也是有效的。

就C标准而言,未初始化的指针不指向任何地方 。 取消引用它是非法的。 因此,原则上不可能观察其目标,因此目标根本不存在于所有意图和目的。

如果你想要一个类似的类比,要求未初始化指针的值就像要求最小正实数的值,或π的最后一个数字的值。

(同一个角色是只有查克诺里斯可以取消引用一个未初始化的指针。)

http://en.wikipedia.org/wiki/Uninitialized_variable

诸如C之类的语言使用变量的堆栈空间,为子例程分配的变量集合称为堆栈帧。 虽然计算机将为堆栈帧留出适当的空间量,但通常只需调整堆栈指针的值即可,而不会将内存本身设置为任何新状态(通常是出于效率问题)。 因此,当时该内存的任何内容都将显示为占用这些地址的变量的初始值。

虽然我认为这是特定于实现的。

此外,您可能应该始终初始化指针,请参阅如何检查无效指针中提供的答案? 以及第一个答案给出的链接: –

http://www.lysator.liu.se/c/c-faq/c-1.html

它是特定于实现/未定义的行为。 指针可能会自动初始化为NULL …或者它只是当时内存中的任何值。

指针是内存中指向内存中另一个地址的地址。 它未初始化的事实并不意味着指针本身没有地址,它只意味着它指向的东西的地址是未知的。 因此,编译器默认将其初始化为NULL,或者地址是当时指针变量空间中的内存。

在很大程度上,当你进入课堂时,它就像一张没有擦过的白板。 如果你在电路板的一部分上画一个盒子但是没有擦掉盒子里的东西,那么盒子里面的东西是什么?

这是以前留下的任何东西。

同样,如果为指针分配空间但不擦除空间,那么空间中的内容是什么?

数据可能会从程序的早期部分或从程序的任何正常部分(例如main函数)开始运行之前运行的特殊代码中遗留下来。 (特殊代码可以加载和链接某些库,设置堆栈,以及以其他方式准备C程序所需的环境。)在嵌入式系统上,而不是典型的多用户系统,数据可能会遗留在先前的进程中。 很可能,之前使用的空间是指针以外的其他东西,所以当它被解释为指针时,它的值没有意义。 它作为指针的值可能指向某个地方但不以任何方式有意义。

但是,你不能依赖于此。 当您使用具有自动存储持续时间的未初始化对象时,C标准不会定义行为。 在许多C实现中,未初始化的指针将仅包含剩余数据。 但是,在某些C实现中,系统可能会检测到您正在使用未初始化的对象并导致程序崩溃。 (其他行为也是可能的。)