sizeof运算符如何在c中工作

时间:2011-06-14 12:33:51

标签: c

我想知道sizeof运算符在C中是如何工作的。在下面的代码中我希望得到输出1但是得到4。因为p指向第一个位置而在第一个位置有字符,它的大小应该是1。 / p>

main()
{

char a[9]="amit";
int *p=&a;
 printf("%d",sizeof((char *)(*p)));
 }

4 个答案:

答案 0 :(得分:6)

不,你要求你的实现中的字符指针的大小为4。

那是因为您将解除引用的int指针p投射到char指针,然后询问其大小。

打破它:

sizeof((char *)(*p))
       |       \__/
       |         \_ Dereference p to get an int.
       \___________/
             \_____ Convert that to a char * (size = 4).

如果您想要处理int的第一个字符(毕竟,这是您投射的字符数组),您应该使用:

sizeof(*((char*)(p)))

这是int指针,强制转换为char指针,然后取消引用。

打破

sizeof(*((char *)(p)))
       | \________/
       |         \_ Get a char * from p (an int *)
       \___________/
             \_____ Dereference that to get a char (size = 1).

答案 1 :(得分:5)

你得到的是演员(char *)的结果大小,这是一个大小为4的字符*。当然你可以说:

 printf( "%d", sizeof(a[0]) );

而且有人想知道你为什么不这样做?

答案 2 :(得分:1)

对于上述问题,答案是4.
在这里,您输入一个指向char指针的整数指针 这意味着现在整数指针正在保持字符 对于sizeof运算符,默认参数为int 当你像sizeof((char *)(*p))一样传递时,它会被视为sizeof('a')。这个char a被提升为int。这就是你获得4分的原因。

答案 3 :(得分:0)

是的,在32位系统上,这段代码应该显示 p的大小为4.在16位上它会显示2(这些天在应用程序世界中没有被高度使用,但可以是基于系统的要求在嵌入式世界中使用)。 您已经对char 进行了强制转换,这将影响数据表示,但不会影响指向数据的指针占用的内存。