[英]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
讓我們忽略未定義的行為以找出可能發生的情況。
p1
和p2
都指向a[0]
(忽略不兼容的指針類型)。
p1
和p2
都是指針。 指向對象類型的指針通常具有相同的大小(假設是這種情況),因此sizeof(p1)==sizeof(p2)
將為真。
p1
是int (*)[2]
,所以*p1
是int[2]
類型。 在大多數表達式中,數組將衰減為指向其第一個元素的指針,因此在表達式*(*p1+2)
, *p1
將衰減為int *
並指向a[0]
。 因此*p1+2
將指向a[2]
。 因此*(*p1+2)
將與a[2]
相同,其值為30
。 因此程序打印30
。
當數組是sizeof
運算符的操作數時,它不會衰減為指針。 *p1
是int[2]
類型, *p2
是int[3]
類型,所以sizeof(*p1)==sizeof(*p2)
等價於sizeof(int[2])==sizeof(int[3])
,這是錯誤的。 因此,不會評估打印*(*p2+1)
值的第二個printf
調用。
(假設第二個printf
被調用並且*(*p2+1)
被求值。 *p2
是int[3]
類型,在這個表達式中它衰減為一個int *
指向a[0]
。因此*p2+1
指向a[1]
。因此, *(*p2+1)
將與a[1],
相同a[1],
其值為20
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.