为什么 Wild 指针包含零地址而不是 garabge 地址?
why wild pointer holds zero address rather than garabge address?
我一直试图在不使用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 相同,但不能将其计算为始终为零。
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 内联程序集printf将整数解释为地址
- 为什么指针不写入类的地址?
- 如何在C++中获取该对象的类声明中对象的地址?
- 通过按地址访问变量
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 函数名是c中该函数的第一条指令的地址吗
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- ReadProcessMemory() 不适用于像 0x2840C6C68D8 这样的长地址
- CUDA:统一内存和指针地址的更改
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 为什么 Wild 指针包含零地址而不是 garabge 地址?