[英]Cast a struct of ints to an array of ints
我正在使用一個具有一個結構數組的函數的庫。 該結構和函數具有以下布局:
struct TwoInt32s
{
int32_t a;
int32_t b;
};
void write(struct TwoInt32s *buffer, int len);
我的初步測試表明,這樣的結構數組與int32_t
數組具有相同的內存布局,所以我可以這樣做:
int32_t *buffer = malloc(2 * len * sizeof(int32_t));
/* fill in the buffer */
write((struct TwoInt32s*)buffer, len);
但是,我想知道這是否普遍適用。 使用int32_t
數組大大簡化了我的代碼。
編輯:我忘了sizeof
根據我的閱讀,C保證了一些關於struct padding的東西:
由此我可以推斷a
和b
之間沒有填充。 但是結構可能最后會有填充。 我對此表示懷疑,因為它在32位和64位系統上都是字對齊的。 有沒有人有這方面的其他信息?
實現可以自由填充結構 - 在a
和b
之間可能有未使用的字節。 但是可以保證第一個成員不會從結構的開頭偏移。
通常,您使用特定於編譯器的編譯指示來管理此類布局,例如:
#pragma pack(push)
#pragma pack(1)
struct TwoInt32s
{
int32_t a;
int32_t b;
};
#pragma pack(pop)
malloc分配字節。 你為什么選擇“2 * len”?
你可以簡單地使用“sizeof”:
int32_t *buffer = malloc(len * sizeof(TwoInt32s));
/* fill in the buffer */
write((struct TwoInt32s*)buffer, len);
正如Erik所說,包裝結構是一個好習慣。
不轉換是最安全的,但轉換 - 即創建一個新數組並用結構中找到的值填充它,然后終止結構。
您可以分配結構,但將其成員視為一種虛擬數組:
struct TwoInt32s *buffer = malloc(len * sizeof *buffer);
#define BUFFER(i) (*((i)%2 ? &buffer[(i)/2].b : &buffer[(i)/2].a))
/* fill in the buffer, e.g. */
for (int i = 0; i < len * 2; i++)
BUFFER(i) = i;
不幸的是,GCC和Clang目前都沒有“獲得”此代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.