簡體   English   中英

size_t和ptrdiff_t類型的變量

[英]variables of type size_t and ptrdiff_t

通過閱讀與size_tptrdiff_t相關的在線帖子,我想確認以下內容:

  1. 如果數組的最大大小小於1/2*(max number represent-able by size_t) ,我可以安全地使用ptrdiff_t並檢查指向同一對象的兩個指針之間的相對距離嗎?(因為我在討論數組, “指向同一對象的指針”表示“指向同一對象的指針”。

  2. 如果我想聲明一個可以表示來自另一個指針的偏移量的變量,我最好將其聲明為ptrdiff_t類型?

  3. 如何在C和C ++中輸出size_tptrdiff_t類型的變量? 以下是否正確: size_t類型的變量的跨平台格式字符串?

  4. uintptr_t只是size_t另一個名稱還是應該用作size_t的單獨類型?

  5. ssize_tintptr_t ptrdiff_t其他名稱還是必須以不同的方式使用?

我開始在Ubuntu上使用gcc。 我在使用別人的代碼時發現了這些類型。

ADDed:我確實希望能夠使用補償。 使用uintptr_tintptr_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_tintptr_t花葯名ptrdiff_t或已被不同使用?

就C或C ++語言而言, ssize_t不是標准類型; 它由Posix定義為一些函數參數和返回值的類型。 除了直接處理Posix函數時,最好使用ptrdiff_t

intptr_t用於保存指針的整數表示,而不是指針之間的差異。 在某些平台上,這些可能具有不同的大小,並且可能根本不定義intptr_t ,因此它們不應互換使用。

我確實希望能夠使用負補償。 使用uintptr_tintptr_t什么區別嗎?

不要使用這些類型中的任何一種來表示偏移量; 使用ptrdiff_t 在特殊情況下,當您希望將指針轉換為其整數表示形式時,請使用這些類型。

uintptr_tintptr_t足夠大,可以保存任何void*指針值而不會丟失信息。 它們需要能夠唯一地表示程序整個地址空間中任何對象的地址 - 包括任何對象中的任何字節。

size_tsizeof運算符產生的sizeof ; ptrdiff_t是通過減去兩個指針產生的類型。 它們只需要足夠大以容納單個對象。 (並且可能有一個如此大的對象,減去指向相反端的兩個指針將溢出。)

大多數當前系統具有單個單片地址空間,但C設計用於不能處理的系統。 例如,在某些系統上,最大可能的對象可能只是整個地址空間大小的一小部分 - 並且比較或減去指向不同對象的指針可能毫無意義。 (考慮一種分段尋址方案,其中指針減法和比較只考慮地址的偏移部分。)

假設_ptrdiff_t_是拼寫錯誤:

1)是的。 如果數組的最SIZE_MAX/2SIZE_MAX/2 ,則可以安全地使用ptrdiff_t
2)有時候: ptrdiff_t通常是兩個指針之間的差異,而size_t是一個偏移量。 這里重要的是size_t總是正面的, ptrdiff_t可能是負面的。 請注意,在某些平台上,它們的大小可能大不相同。
3)輸出size_tptrdiff_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM