[英]variables of type size_t and ptrdiff_t
通過閱讀與size_t
和ptrdiff_t
相關的在線帖子,我想確認以下內容:
如果數組的最大大小小於1/2*(max number represent-able by size_t)
,我可以安全地使用ptrdiff_t
並檢查指向同一對象的兩個指針之間的相對距離嗎?(因為我在討論數組, “指向同一對象的指針”表示“指向同一對象的指針”。
如果我想聲明一個可以表示來自另一個指針的偏移量的變量,我最好將其聲明為ptrdiff_t
類型?
如何在C和C ++中輸出size_t
和ptrdiff_t
類型的變量? 以下是否正確: size_t類型的變量的跨平台格式字符串?
是uintptr_t
只是size_t
另一個名稱還是應該用作size_t
的單獨類型?
是ssize_t
和intptr_t
ptrdiff_t
其他名稱還是必須以不同的方式使用?
我開始在Ubuntu上使用gcc。 我在使用別人的代碼時發現了這些類型。
ADDed:我確實希望能夠使用負補償。 使用uintptr_t
和intptr_t
什么區別嗎?
1:如果數組的最大尺寸小於1/2 *(最大數目代表-能夠通過
size_t
),I可以安全地使用ptrdiff_t
,並檢查兩個指針之間的相對距離相同的對象?
如果sizeof(size_t) <= sizeof(prtdiff_t)
就是這種情況。 在合理的實施中將是這種情況,但不能保證。
2:如果我想聲明一個可以表示來自另一個指針的偏移量的變量,我最好將其聲明為
ptrdiff_t
類型?
是的,這就是該類型的用途。
3:如何在C和C ++中輸出size_t和ptrdiff_t類型的變量?
在C:
printf("%zu %td\n", size, ptrdiff);
在C ++中:
std::cout << size << ' ' << ptrdiff << '\n';
4:是
uintptr_t
只是size_t
另一個名稱還是應該用作size_t
的單獨類型?
它應該被視為一種單獨的類型。 uintptr_t
是一個整數類型,可以包含轉換為整數的任何指針值; 它可能不存在於某些平台上。
5:是
ssize_t
和intptr_t
花葯名ptrdiff_t
或已被不同使用?
就C或C ++語言而言, ssize_t
不是標准類型; 它由Posix定義為一些函數參數和返回值的類型。 除了直接處理Posix函數時,最好使用ptrdiff_t
。
intptr_t
用於保存指針的整數表示,而不是指針之間的差異。 在某些平台上,這些可能具有不同的大小,並且可能根本不定義intptr_t
,因此它們不應互換使用。
我確實希望能夠使用負補償。 使用
uintptr_t
和intptr_t
什么區別嗎?
不要使用這些類型中的任何一種來表示偏移量; 使用ptrdiff_t
。 在特殊情況下,當您希望將指針轉換為其整數表示形式時,請使用這些類型。
uintptr_t
和intptr_t
足夠大,可以保存任何void*
指針值而不會丟失信息。 它們需要能夠唯一地表示程序整個地址空間中任何對象的地址 - 包括任何對象中的任何字節。
size_t
是sizeof
運算符產生的sizeof
; ptrdiff_t
是通過減去兩個指針產生的類型。 它們只需要足夠大以容納單個對象。 (並且可能有一個如此大的對象,減去指向相反端的兩個指針將溢出。)
大多數當前系統具有單個單片地址空間,但C設計用於不能處理的系統。 例如,在某些系統上,最大可能的對象可能只是整個地址空間大小的一小部分 - 並且比較或減去指向不同對象的指針可能毫無意義。 (考慮一種分段尋址方案,其中指針減法和比較只考慮地址的偏移部分。)
假設_ptrdiff_t_
是拼寫錯誤:
1)是的。 如果數組的最SIZE_MAX/2
於SIZE_MAX/2
,則可以安全地使用ptrdiff_t
2)有時候: ptrdiff_t
通常是兩個指針之間的差異,而size_t
是一個偏移量。 這里重要的是size_t
總是正面的, ptrdiff_t
可能是負面的。 請注意,在某些平台上,它們的大小可能大不相同。
3)輸出size_t
和ptrdiff_t
類型的變量的方式與輸出任何其他變量類型的方式相同。
size_t a = 10;
ptrdiff_t b = 20;
printf("%u %d", ((unsigned int)a), ((int)b));
std::cout << a << b;
4) uintptr_t
是一個至少與int*
一樣大的無符號整數,以安全地允許指針上的整數數學運算。 就我所知, size_t
不能保證是相同的。
5) ssize_t
是非標准C類型,對應於ptrdiff_t
。 請改用ptrdiff_t
。 ( On platforms supporting the POSIX 1003.1-1996 API standard, which includes most Unix-like systems, a signed variant of size_t named ssize_t is available, which was not part of the ANSI or ISO C standards.
.http://en.wikipedia。 org / wiki / Size_t )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.