2016-12-29 23 views
0
#include <stdio.h> 
struct test 
{ 
    int a; 
    char b; 
    int c; 
}; 
int main() 
{ 
    struct test *ptr = (struct test *)0; 
    ptr++; 
    fprintf(stderr, "by pointer = %zd\n", (size_t) ptr); 
    fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test)); 
    return 0; 
} 
+2

有什麼問題嗎? – e0k

+0

如果一個指針被賦值爲零,那麼就沒有指針了 – samgak

+0

總是最好把一個指針指向'uintptr_t',它保證是一個指針的大小。 'size_t'不能保證適合它 –

回答

2

在您的情況下遞增ptr的行爲是undefined

請注意(size_t)ptr實現定義。將指針轉換爲size_t總是有效的,但如果結果不能用size_t類型表示,則行爲是未定義的。

C標準允許您將指針設置爲0,但指針算術僅在數組中有效,不同之處在於您允許指向一個超過數組末尾或超過標量地址的指針。

注意,正確的格式說明了sizeof類型是%zu - 否則你有更加未定義行爲的潛力。

+0

但這段代碼工作我沒有得到那點ptr ++?它給出了正確的sizeof struct –

+1

這是未定義行爲的本質。它可能似乎工作,在其他日子編譯器可能會吃掉你的貓。 – Bathsheba

+0

從指針到整數的轉換是實現定義的。 – 2501

-1

指針的類型是「struct test」。這就是發生在這裏的事情。

1)「的ptr」被分配給存儲位置「0」(NULL指針ü可以說:))

2)「的ptr ++」將由結構測試的尺寸增加存儲器的位置,因爲指針是結構類型。因此,它現在指向地址「12」。

3)sizeof(struct)給出12是因爲填充。 (它看起來應該給9,但是它給出12,因爲3字節填充在字符變量中)

現在讓我們稍微修改一下你的代碼。

#include <stdio.h> 
struct test 
{ 
    int a; 
    char b; 
    char d; 
    int c; 
}; 
int main() 
{ 
    struct test A; 
    struct test *ptr = (struct test *)0; 
    ptr++; 
    fprintf(stderr, "by pointer = %zd\n", (size_t) ptr); 
    fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test)); 

    ptr = &A; 
    fprintf(stderr, "by pointer = %zd\n", (size_t) ptr); 
    fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test)); 
    return 0; 
} 

這是輸出U將得到:

by pointer = 12 
by sizeof = 12 
by pointer = 140737488347632 
by sizeof = 12 

我希望這將澄清烏爾疑問