#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;
}
0
A
回答
2
在您的情況下遞增ptr
的行爲是undefined。
請注意(size_t)ptr
是實現定義。將指針轉換爲size_t總是有效的,但如果結果不能用size_t類型表示,則行爲是未定義的。
C標準允許您將指針設置爲0,但指針算術僅在數組中有效,不同之處在於您允許指向一個超過數組末尾或超過標量地址的指針。
注意,正確的格式說明了sizeof
類型是%zu
- 否則你有更加未定義行爲的潛力。
-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
我希望這將澄清烏爾疑問
相關問題
- 1. 裏面的結構指針分配值
- 2. 分配並給予下述的結構聲明指針
- 3. 結構和指針指針
- 4. 在C將值分配給一個指針結構構件
- 5. 將指針複製到指向結構中某個結構的指針C
- 6. 指針結構
- 7. 指針結構
- 8. 結構指針
- 9. 結構指針
- 10. 結構指針
- 11. 結構指針
- 12. 指向結構指針的指針
- 13. 如何將指針指向的地址分配給另一個本地指針
- 14. 設置結構的指針成員,從指針指向結構的指針
- 15. 指針的結構
- 16. 結構指針的地址分配會產生錯誤
- 17. 分配空間的指針結構
- 18. 分配內存的指針結構
- 19. 指針指向結構指針錯誤
- 20. COM指針結構
- 21. 指針和結構
- 22. 結構和指針
- 23. C++結構指針
- 24. 雙指針結構
- 25. C結構,指針
- 26. 指針和結構
- 27. 樹指針結構
- 28. C結構指針
- 29. 修改結構體指針的指針
- 30. 指針到嵌套結構
有什麼問題嗎? – e0k
如果一個指針被賦值爲零,那麼就沒有指針了 – samgak
總是最好把一個指針指向'uintptr_t',它保證是一個指針的大小。 'size_t'不能保證適合它 –