我用C progrmming一個新手,我已經看了看下面的代碼:括號中定義一個指針C編程
struct iphdr *iph = (struct iphdr *)Buffer;
是什麼表達什麼意思?
這裏是鏈接到代碼http://www.binarytides.com/packet-sniffer-code-c-linux/
我用C progrmming一個新手,我已經看了看下面的代碼:括號中定義一個指針C編程
struct iphdr *iph = (struct iphdr *)Buffer;
是什麼表達什麼意思?
這裏是鏈接到代碼http://www.binarytides.com/packet-sniffer-code-c-linux/
它轉換buffer
的指針struct iphdr
然後初始化iph
該指針。這是因爲buffer
是指向原始字節緩衝區的指針,但在此函數中已知存儲在緩衝區中的字節遵循struct iphdr
的格式。因此struct iphdr
可用於訪問緩衝區的內容,而不必解釋和操作原始字節。
編輯:澄清(根據評論):演員不復制或轉換任何東西。它基本上只是告訴編譯器「我知道buffer
應該包含unsigned char
s,但在這個特定時間這些字節實際上是struct iphdr
,所以讓我通過指針iph
以更方便的方式訪問它們。
(根據與問題鏈接的原始代碼,我使用了小寫名稱「緩衝區」。) – Arkku
這是我如何理解發生的事情,請告訴我,如果我錯了。 'buffer'是一個無符號字符數組,如果'iphdr'的第一個成員是3個無符號字符的數組,那麼它將複製緩衝區的前3個字符,同樣會發生在'iphdr'的更多成員上。謝謝 – maximilliano
buffer
是指向正用於存儲原始數據包數據的unsigned char
數組的指針。
這將重寫buffer
的類型,以便將其理解爲指向struct iphdr
的指針,因此您可以將其指定給iph
並將其作爲結構體讀取。從技術上講,這只是抑制編譯器錯誤,可以說buffer
的值不能分配給iph
,因爲它們是不同的類型,儘管它們都是指針。
或者,您可以改爲使用void*
類型的buffer
。
一個指向void
可以分配給其他任何指針類型,而不需要重鑄它的類型:
void* buffer = malloc(65536);
...
void ProcessPacket(void* buffer, int size) {
struct iphdr *iph = buffer;
...
}
這就是所謂的鑄造...基於C的任何教程或引用將覆蓋它。我強烈建議人們實際上閱讀關於編程語言的書籍,而不是試圖混淆視聽。 –