[英]sizeof operator in c on pointers of same type giving different results in C
我知道指針的大小類似於設備地址架構。 但我無法理解為什么相同的函數和參數會給出不同的結果。 請查看代碼,讓我知道是什么原因。
#include <stdio.h>
#include <stdint.h>
int main()
{
uint8_t a[22]={1,2,3,4,5};
uint8_t* p[2]={a};
printf("%d\n%d\n",&a,p[0]);
printf("%d,%d",sizeof(a),sizeof(p));
return 0;
}
606584768 606584768 22,16
數組和指針的類型不同,數組會衰減為指針但本身不是指針。
sizeof(a) 給出了 uint_8[22] 的實際大小,而 sizeof(p) 給出了 uint8_t *[2] 的實際大小;
“ T
N 元素數組”類型的表達式將“衰減”為“指向T
指針”類型的表達式,除非該表達式是sizeof
或一元&
運算符的操作數。
表達式a
類型為“22 個元素的uint8_t
數組”,因此sizeof a
將為您提供與sizeof (uint8_t) * 22
相同的結果。 表達式p
類型為“指向uint8_t
( uint8_t *
) 的指針的2 元素數組”,因此sizeof p
與sizeof (uint8_t *) * 2
。
總結一下:
a == some_address;
sizeof a == 22 ( sizeof (uint8_t) should be 1)
p == some address;
p[0] == address of the first element of a
sizeof p == 2 * sizeof (uint8_t *) (assuming pointer size is 8, this will be 16)
sizeof p[0] == sizeof (uint8_t *)
因為 a 和 b 有區別,首先讓我們檢查一下 a
uint8_t a[22]={1,2,3,4,5};
這行代碼意味着 a 是由 22 個元素組成的數組,每個元素有 8 位(一個字節)所以 sizeof(a) 是 22*1=22 其次相對於 b
uint8_t* p[2]={a};
這行代碼意味着 b 是指針數組,由 2 個元素類型的指針組成,它們在設計架構方面具有相同的大小,因此 sizeof(p) 是 (2 pointer * 8 )=16
sizeof(a) 給出的數組大小為 22 但 sizeof(b) 給出由兩個指針組成的指針數組的大小 (2*8=16)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.