簡體   English   中英

*(int *)(緩沖區)是什么意思?

[英]What does *(int*)(buffer) mean?

在我正在閱讀的c ++代碼中,發現了以下內容。 任何人都可以幫助我理解以下陳述的作用嗎?

char buffer[4096];
// some code
int size = *(int*)(buffer);
char buffer[4096];//this is an array of 4096 characters
// some code

int size = *(int*)(buffer);

將(衰減的)字符指針( buffer )轉換為整數指針。 然后它取消引用它以獲得整數值 從中獲得的整數值將由buffer數組的前4個字符值組成,假設int的大小在您的機器中是4個字節,或者通常由sizeof(int)字符組成。

換句話說, buffer數組的第一個sizeof(int)字符的內存表示將被視為表示單個整數值,因為現在它由整數指針指向,並且將存儲在size取消引用該整數指針時的整數變量。

話雖如此,正如評論部分反復說明的那樣,這段代碼是不安全的。 有一點我想到的是,有些CPU有嚴格的對齊要求(參見這個答案 ),在這種情況下,不能保證buffer數組的第一個元素的地址符合整數的對齊要求,從而導致這些CPU中的未定義操作。

請參閱@Lundin答案,了解更多原因,為什么此代碼不安全,可能無法提供您正在尋找的結果。

TL; DR:這段代碼很糟糕,忘了它並繼續前進。


(buffer)這個括號表示程序員對自己的編程能力不安全。

由於buffer是一個字符數組,因此使用標識符buffer為您提供指向第一個元素的指針: char指針。

(int*)這是一個轉換,將char指針轉換為int指針。

*獲取該整數指針的內容,結果存儲在整數size

請注意,此代碼完全不安全。 許多指針轉換會調用定義不明確的行為。 可能存在對齊問題。 可能存在指針別名問題(Google“嚴格別名規則”)。 此特定代碼也依賴於endianess,這意味着它要求字符數組的內容具有給定的字節順序。

總的來說,在執行此類操作時,使用諸如intchar (可能是signed)之類的簽名類型沒有任何意義。 特別是, char類型非常有問題,因為它具有實現定義的簽名,應該避免。 請使用unsigned charuint8_t

稍差的代碼看起來像這樣:

#include <stdint.h>

uint8_t buffer[4096];
// some code
uint32_t size = *(uint32_t*)buffer;

任何人都可以幫助我理解以下陳述的作用嗎?

第一個聲明:

char buffer[4096];

聲明一個大小為4096chars數組。

第二個聲明:

int size = *(int*)(buffer);

1.首先將衰減的字符指針帶到數組buffer (也稱為buffer ),這是一個指向其第一個元素的指針,在其聲明時設置

2.然后將其轉換為指向intint*指針

3.最后,將此指針的內容(將為int類型)分配給可變size

它接受buffer[0]的地址,將其轉換為int* ,取消引用,並使用解除引用的值初始化size 換句話說,它占用buffer的第一個sizeof(int)字節,假裝這些字節是int ,並將int的值存儲在size

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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