簡體   English   中英

c 中相同類型的指針上的 sizeof 運算符在 C 中給出不同的結果

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM