[英]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.