2015-04-15 63 views
1

請解釋下面提到的程序的輸出。我認爲,輸出應爲1,但它不是1c程序的程序輸出

#include <stdio.h> 

int main() 
{ 
    int a[] = {1, 2, 3, 4, 5, 6}; 
    int *ptr = (int*)(&a+1); 

    printf("%d ", *(ptr-1)); 
    getchar(); 

    return 0; 
} 
+0

'輸出應該是1但它不是1' ...那它是什麼? –

+0

您可能希望包含更多信息,包括您收到的實際輸出。 – Matt

+2

'&a'的類型是'int(*)[6]'。它意味着指向'int [6]'的指針。所以'&a + 1'指向下一個('a [6]')最後一個元素('6':'a [5]')。然後投射到'int *'然後'-1',以指向最後一個元素'6'。 – BLUEPIXY

回答

3

這是因爲&a的類型是int(*)[6]因此&a + 1 != &a[0] + 1這是你的意思,鑑於你的預期輸出。

如果打印地址&a&a[0],他們將是相同的,但遞增&a是不一樣的遞增&a[0]因爲sizeof(int) != sizeof(int *),雖然這並不總是正確的,你的代碼不應該假設它,或者取決於。

此外,我們發現您正在使用的造型,因爲你的編譯器在抱怨一個事實,即&a是不兼容的指針類型的,你不應該需要投如果指針是兼容的類型,以便

#include <stdio.h> 

int main() 
{ 
    int a[] = {1, 2, 3, 4, 5, 6}; 
    int *ptr = &a[0] + 1; 

    printf("%d\n", *(ptr-1)); 

    return 0; 
} 

應該編譯才能找到,輸出將如您所期望的那樣爲1

+0

downvoter似乎不同意,我想看看你的答案,看看我的是真的錯或不好。 –

+0

我在同一件事情上有困惑..你可以請澄清一點 –

+0

不知道爲什麼這被拒絕。希望看到downvoter評論他們的推理。 –

1

a&a是相同的值,
aint [6]類型的,
&aint (*)[6]類型。

這意味着

ptr 
== (int *)(   &a + 1    ) 
== (int *)((char *) &a + 1*sizeof(*&a) ) 
== (int *)((char *) &a + 1*sizeof(a)  ) 
== (int *)((char *) &a + 1*6*sizeof(int) ) 
== (int *)((char *) a + 1*6*sizeof(int) ) 
== (int *)((char *) a + 1*6*sizeof(*a) ) 
== (int *)(   a + 6    ) 
== &a[6] 

從而

*(ptr-1) == *(a+5) == a[5] == 6 

之所以 「6」 被打印。