为什么 Wild 指针包含零地址而不是 garabge 地址?

why wild pointer holds zero address rather than garabge address?

本文关键字:地址 garabge 指针 包含零 为什么 Wild      更新时间:2023-10-16

我一直试图在不使用sizeof((的情况下找到像"int"这样的特定数据类型的大小,并发现:

#include<stdio.h>
int main() {
int *ptr;   /*Declare a pointer*/
printf("Size of ptr = %dn",ptr);
ptr++;
printf("Size of ptr = %dn",ptr);
return 0;
}

这将返回正确的 int 大小。 野生指针不是应该包含垃圾地址而不是零吗?如果它包含零,它与 NULL 指针有何不同,因为 NULL 是 (void*(0 ?

由于ptr是未初始化的,因此其值是不确定的,访问其值会产生未定义的行为。 具有讽刺意味的是,"未定义"的含义被C和C++标准定义为"此标准不限制发生的事情"。

初学者经常错误地认为这意味着它必须包含"垃圾值"或"野生指针"或"在此处添加一些丰富多彩的描述",但事实并非如此。

"值是不确定的">

或"访问值的行为是未定义的"的含义是,访问值的代码允许任何行为。

访问该值对于打印它、递增它或(如果是指针(取消引用它(访问由指针的值标识的地址的内容(是必需的。

访问值的代码的行为是未定义的。 给出打印值为零、42或"垃圾值"都是正确的结果。 但是,同样,结果可能意味着没有输出或不需要的操作,例如重新格式化硬盘驱动器。 如果代码重复执行,行为甚至可能随着时间的推移而改变。 或者它可以 100% 可重复(对于特定的编译器、特定的操作系统、特定的硬件等(。

实际上,具有未定义行为的代码在程序测试期间没有出现故障的迹象是很常见的,但后来在客户计算机上安装和执行程序时会导致一些令人讨厌的、可见但意想不到的效果。 这往往会导致脾气暴躁的客户,开发人员可能无法复制的错误报告,以及开发人员试图修复缺陷的压力。

因此,试图解释为什么未定义的行为会导致某些特定结果(例如打印值为零(是没有意义的。

第一次打印将有垃圾或零,具体取决于您的编译器和内存位置中的先前值。 如果为零,则第二次打印的大小将为 int,因为递增指针会随着指针的大小而递增。

例如:

char *x = 0;
x++; //x=1
int *y = 0;
y++; //y=4

在您的情况下,如果您在第一次打印时得到 0,则与将其初始化为 NULL 相同,但不能将其计算为始终为零