簡體   English   中英

sizeof() 運算符和指針聲明中的問題

[英]Problem in sizeof() operator and poiner declaration

這個問題是在我的 Sem-2 考試中被問到的。 問題要求我們給出所需的輸出。

int main(void)
{
    int a[] = {10,20,30,40,50,60};

    int (*p1)[2]=a , (*p2)[3]= a;

    if(sizeof(p1)==sizeof(p2))
    printf("%d",*(*p1+2));

    if(sizeof(*p1)==sizeof(*p2))
    printf("%d",*(*(p2+1)));

    return(0);
}

編譯器警告:

Warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
         initialization from incompatible pointer type [-Wincompatible-pointer-types]

我期望的輸出:20

運行時得到的輸出:30

使用:gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0

讓我們忽略未定義的行為以找出可能發生的情況。

p1p2都指向a[0] (忽略不兼容的指針類型)。

p1p2都是指針。 指向對象類型的指針通常具有相同的大小(假設是這種情況),因此sizeof(p1)==sizeof(p2)將為真。

p1int (*)[2] ,所以*p1int[2]類型。 在大多數表達式中,數組將衰減為指向其第一個元素的指針,因此在表達式*(*p1+2)*p1將衰減為int *並指向a[0] 因此*p1+2將指向a[2] 因此*(*p1+2)將與a[2]相同,其值為30 因此程序打印30

當數組是sizeof運算符的操作數時,它不會衰減為指針。 *p1int[2]類型, *p2int[3]類型,所以sizeof(*p1)==sizeof(*p2)等價於sizeof(int[2])==sizeof(int[3]) ,這是錯誤的。 因此,不會評估打印*(*p2+1)值的第二個printf調用。

(假設第二個printf被調用並且*(*p2+1)被求值。 *p2int[3]類型,在這個表達式中它衰減為一個int *指向a[0] 。因此*p2+1指向a[1] 。因此, *(*p2+1)將與a[1],相同a[1],其值為20 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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