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_nameor sizeof (int *)。
当您的程序运行时,它会更改 p 指向的对象,但 p 的值sizeof (*p)已经被计算并硬编码到您的可执行加载模块中。
我认为您的困惑是您认为 C 会在程序运行时找出 p 指向的数据类型。