我已經記不清,很久以前,我做了這樣的事情在C次數:在C中重新解釋內存的正確方法是什麼?
struct foo f;
struct foo* pf = &f;
char* pc = (char*) pf;
transmit(pc, sizeof(f));
或許:
char* buffer[1024];
receive(buffer, 1024);
float values[256];
for(int ii = 0; ii < 256; ii++) {
float* pf = (float*)(buffer + ii*4);
values[ii] = *pf;
}
或許:
uint32_t ipAddress = ...;
uint8_t* p = (uint8_t*)&ipAddress;
uint8_t octets[4] = {p[0], p[1], p[2], p[3]};
printf("%d.%d.%d.%d\n", octets[0], octets[1], octets[2], octets[3]);
我剛纔發現,通過轉換爲另一個指針類型來重新解釋這樣一段內存會調用未定義的行爲。然而,上述所有例子都是絕對必要的。什麼是正確的做他們的方式?
我可能會對'union'關鍵字感興趣嗎? – Christoph
就我個人而言,我認爲使用聯合是一種比類型轉換更糟糕的解決方案。編寫更多的代碼,創建更多奇怪的類型,而且你仍然需要在整個地方施放。 –
@CarlNorum:如果你的目標類型不是'char',只需投射指針就會導致UB;有效的打字規則基本上使C成爲強類型語言,其中類型信息被綁定到存儲位置本身;然而,類型系統是非常不健全的,因爲編譯器會樂意嘗試通過錯誤類型的表達式來訪問內存,但實際上可能會假定這些不變量存在於更高的優化級別(例如,在「嚴格別名」情況下) – Christoph