【发布时间】:2020-08-29 04:24:48
【问题描述】:
我一直试图在不使用 sizeof() 的情况下查找特定数据类型(如“int”)的大小,结果发现:
#include<stdio.h>
int main() {
int *ptr; /*Declare a pointer*/
printf("Size of ptr = %d\n",ptr);
ptr++;
printf("Size of ptr = %d\n",ptr);
return 0;
}
这将返回正确的 int 大小。如何? 野指针不应该包含垃圾地址而不是零。如果它包含零,它与 NULL 指针有何不同,因为 NULL 是 (void*)0 ?
【问题讨论】:
-
这是未定义的行为,任何事情都可能发生。你不应该有任何特别的期望
-
ptr未初始化并且具有不确定的值。阅读它是未定义的行为。你不会从这段代码中学到任何有用的东西。 -
垃圾与零有何不同?这基本上是你的问题。实际上,C++ 标准并没有说“野指针”具有“垃圾值”。它说读取未初始化变量的程序具有未定义的行为。这意味着编译器可以以他们喜欢的任何方式编译此类程序,并且仍然符合 C++ 标准。
-
@M.M 当我读到这个问题时,OP 试图通过在增量之后减去指针值来确定
sizeof int。我相信这在技术上是 UB,但是在大多数实现中它仍然可以按预期工作。在它成为语言的一部分之前,它与offsetof的旧宏并没有什么不同。 -
@kpk 您的未分配指针的初始值为
0(与NULL相同)纯属偶然。下次运行时,或者使用下一版本的编译器编译时,该值可能会有所不同。也就是说,(int)((int*)ptr + 1) - (int)((int*)ptr) == sizeof int将 成立,无论ptr的值如何,在大多数实现中,指针“适合”到 int 中,并且它的 UB 部分具有更微妙的变化。