char c[] = {'a','b','c'};
int* p = &c[0];
printf("%i\n", sizeof(*p)); //Prints out 4
printf("%i\n", sizeof(*c)); //Prints out 1
我对这部分代码感到非常困惑。p 和 c 都表示数组 c 在第 0 个索引处的地址。但是为什么 sizeof(*p) 会打印出 4 呢?不应该是1吗?
因为p
是 type int *
,所以*p
是 type int
,在您的实现中显然是 4 个字节宽。
如果您不希望您的程序调用未定义的行为,请用于打印(产生什么%zu
)size_t
。sizeof
sizeof(*p)
int
是指向的对象的大小p
。
sizeof(*p) 将打印 p 的大小,因为 int 是 4,但 c 是 char 这就是为什么它是 1
在 C(不是 C99)中,sizeof
运算符是严格的编译时计算。因此,当sizeof (*p)
评估 [a dereferenced ptr to an integer] 时,大小int
为 4。
笔记。该(*p)
语句的一部分是“强制转换”运算符。因此, sizeof 不是像 in 那样的函数调用sizeof(xyz)
,而是像sizeof var_name
or sizeof (int *)
。
当您的程序运行时,它会更改 p 指向的对象,但 p 的值sizeof (*p)
已经被计算并硬编码到您的可执行加载模块中。
我认为您的困惑是您认为 C 会在程序运行时找出 p 指向的数据类型。