C – SizeOf指针

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都表示第0个索引处的数组c的地址。 但是为什么sizeof(* p)打印4? 不应该是1吗?

因为p的类型是int * ,所以*pint类型,在你的实现上显然是4个字节宽。


如果您不希望程序调用未定义的行为,请使用%zu打印size_t (产量sizeof )。

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

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

在C(不是C99)中, sizeof运算符严格地是编译时计算。 因此,当评估sizeof (*p) [取消引用的ptr到整数]时, int的大小为4。

注意。 该陈述的(*p)部分是“强制转换”运算符。 因此,sizeof不是sizeof(xyz)的函数调用,而是像sizeof var_namesizeof (int *)

当程序运行时,它会更改p指向的对象,但sizeof (*p)的值已经计算并硬编码到可执行加载模块中。

我认为你的困惑在于你认为C会找出程序运行时p指向的数据类型。