2017-08-10 142 views
-2
char mem[8]; 
uint64_t *memory{(uint64_t*)(void*)&mem[0]}; 
std::cout << "diff: " << (void*)memory - (void*)(&mem[0]) << std::endl; 

簡單的例子,用gcc錯誤消息是:C++無效使用void,爲什麼?

error: invalid use of ‘void’ 
std::cout << "diff: " << (void*)memory - (void*)(&mem[0]) << std::endl; 
+1

你想做什麼?將'char []'重新解釋爲單個'uint64_t'? – CoryKramer

+2

你不能在'void *'上執行指針運算 – Kevin

+0

@CoryKramer很多時候,試圖將'char []'轉換爲'uint64_t'數組。我認爲這很容易,但這讓我難以置信...... – user3728501

回答

1

無效使用無效的,爲什麼呢?

這是因爲void*(存儲在此指針處的項目)的大小未知。

如果要計算以字節爲單位的指針之間的距離,將它們轉換成的東西1字節大小(字符*,無符號字符*,uint8_t *等)指針:

std::cout << "diff: " << (uint8_t*)memory - (uint8_t*)(&mem[0]) << std::endl;

+0

如果我順便將它們轉換爲'(uint64_t *)'會發生什麼?我的假設是差異仍然是相同的,以字節度量? – user3728501

+0

@ user3728501它將測量「uint64_t」(8字節)的距離舍入到底部。例如,距離'2字節'將是'0 uint64_t' – ikleschenkov

+0

「距離2字節將是0 uint64_t」 - 這沒有任何意義? – user3728501

0

您無法使用void指針執行指針算術 - 請參閱here。這是由於void沒有定義「大小」,而例如。與int *x,你知道x+1將沿x地址進一步sizeof(int)字節。

您也可以測試它here - 刪除-兩側的任何一個表達式都會讓它編譯。

相關問題