2011-03-09 97 views
0
#include <stdio.h> 
struct audiocd { 
    char title[256]; 
    int trackNo; 
    char type; 
    char publisher[256]; 
}; 
int main() { 
    struct audiocd* cdptr; 
    struct audiocd cdarray[4]; 
    cdptr = cdarray; 

    printf("%d\n", &(cdarray[2])); 
    printf("%d\n", cdptr); 
} 

什麼是cdarray[2] & cdptrc結構問題

編輯:謝謝,但如果printf("%d\n", &cdarray)4291520,是否有可能跟蹤printf("%d\n", &(cdarray[2])) & printf("%d\n", cdptr)

+4

你是什麼意思「他們是什麼?」這是什麼讓你感到困惑? – 2011-03-09 02:35:58

回答

4

該程序的整體效果只是未定義的行爲。它將地址傳遞給printf,但使用%d轉換,該轉換需要int。不匹配導致未定義的行爲。

在int和指針大小相同的典型情況下,它將打印出地址cdptr和地址cdarray[2]

如果你想打印出這些地址,明顯的方法是這樣的:

printf("%p", (void *)&cdarray[2]); // (void *)cdarray+2 
printf("%p", (void *)cdptr); 

至於那些什麼表情「是」,他們的地址 - 數組的開始地址和數組的第三個元素。

+1

在這篇文章之前沒有看到'%p' ..感謝這堂課。 – Jokester 2011-03-09 03:09:39

+0

@詹姆斯:好點 - 糾正。 – 2011-03-09 03:57:03

0

這是你應該如何進行打印(%U代替%d的打印指針的地址)

#include <stdio.h> 
struct audiocd { 
    char title[256]; 
    int trackNo; 
    char type; 
    char publisher[256]; 
}; 
int main() { 
    struct audiocd* cdptr; 
    struct audiocd cdarray[4]; 
    cdptr = cdarray; 

    printf("%u\n", (cdarray[2])); 
    printf("%u\n", cdptr); 
} 

通過你的代碼僅僅是打印1的內存地址和結構音頻CD的陣列的第三元素的方法。

+2

%你仍然給未定義的行爲。 – 2011-03-09 02:43:07

+0

'%u'也是不正確的,並且會在編譯期間發出警告。 '%p'專門用於指針。 – 2011-03-09 02:45:30

+0

如果你不注意那個警告,反正你可能會想'%x'以十六進制顯示它。但是無論如何你應該留意警告。 – user470379 2011-03-09 02:46:36

0

感謝,但如果輸出( 「%d \ n」 個, & cdarray)是4291520,是否有可能 跟蹤的printf( 「%d \ n」 個,&(cdarray [2])) & printf(「%d \ n」,cdptr)。

如果我正確了你的問題,我想你想從cdarray的價值推斷&(cdarray [2])和&(cdptr)的值。

當您將cdarray分配給cdptr時,cdptr將存儲數組的起始地址。現在&(cdarray [2])僅僅是

cdarray + 2*sizeof(struct audiocd) 

而且,如上面所討論的,%p應該被用於打印的存儲器地址,而不是%d。