繁体   English   中英

sizeof 运算符在 c 中的工作原理

[英]How sizeof operator works in c

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

main()
{

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

不,您要求的字符指针的大小在您的实现中为 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).

您将获得强制转换结果的大小(char *) ,这是一个大小为 4 的 char *。当然您可以说:

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

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

对于上述问题,答案是 4。
在这里,您将 integer 指针类型转换为 char 指针。
这意味着现在 integer 指针正在保存字符。
对于 sizeof 运算符,默认参数是 int。
当您像sizeof((char *)(*p))一样传递时,它会将其视为sizeof('a') 这个 char a 被提升为 int。 这就是你得到4的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM