2016-04-07 118 views
1

我正在看一些操縱數據緩衝區的舊代碼。我有很多地方有:指針運算的類型

char *ptr1 ; 
char *ptr2 ; 

然後我需要找到兩者之間的字節數。

int distance = ptr2 - ptr1 ; 

我收到了很多關於截斷的警告。什麼是

ptr2 - ptr1 

我已經找到了一些處理指針算術的答案,但奇怪的是不是這個特定問題的答案。

Pointer Arithmetic

+0

這可能是你在64位平臺上,這意味着你的指針實際上是64位地址。如果將LHS類型更改爲64位整數,警告可能會消失。 – klog

回答

5

兩個指針相減的結果†是std::ptrdiff_t。它是一個實現定義的有符號整數;它可能大於int可以存儲的值。

查看http://en.cppreference.com/w/cpp/types/ptrdiff_t瞭解更多信息。

†如果指針指向相同數組的元素,則只能減去指針,否則爲UB。

+0

他們是循環緩衝區,所以它的工作原理。我對這個代碼中整數轉換的警告數量感到震驚,這個代碼很乾淨。 C++衆神走上了一條不可持續的道路。 C++是否添加了帶範圍檢查的整型轉換?長時間縮短並檢查該值是否在短期範圍內? – user3344003

+0

@ user3344003:我一直沒有跟上最新的C++東西,所以C++ 14或更高版本可能有一個實用程序,但我不這麼認爲。 IIRC Boost具有'numeric_cast',它將在將範圍限制爲較小的目標類型之前進行實際檢查。在你的情況下,這將是開銷,因爲你可能在實現中保證你的緩衝區大小符合'int'。這對'static_cast'非常有用,然後告訴編譯器「我知道這是安全的,請使用'int'」。您可能希望事先聲明(),以作爲未來開發人員的安全預防措施。 – GManNickG