0
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吗?

4

4 回答 4

6

因为p是 type int *,所以*p是 type int,在您的实现中显然是 4 个字节宽。


如果您不希望您的程序调用未定义的行为,请用于打印(产生什么%zusize_tsizeof

于 2013-08-21T16:37:57.827 回答
4

sizeof(*p)int是指向的对象的大小p

于 2013-08-21T16:37:50.813 回答
0

sizeof(*p) 将打印 p 的大小,因为 int 是 4,但 c 是 char 这就是为什么它是 1

于 2013-08-21T17:22:01.423 回答
0

在 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 指向的数据类型。

于 2013-08-21T21:46:59.240 回答