簡體   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