簡體   English   中英

將一個int結構轉換為一個int數組

[英]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的東西:

  1. 會員不會被重新訂購
  2. padding僅在具有不同對齊的成員之間或在結構的末尾添加
  3. 指向結構的指針指向與指向其第一個成員的指針相同的內存位置
  4. 每個成員以適合其類型的方式對齊
  5. 結構中可能存在未命名的孔以實現對齊

由此我可以推斷ab之間沒有填充。 但是結構可能最后會有填充。 我對此表示懷疑,因為它在32位和64位系統上都是字對齊的。 有沒有人有這方面的其他信息?

實現可以自由填充結構 - 在ab之間可能有未使用的字節。 但是可以保證第一個成員不會從結構的開頭偏移。

通常,您使用特定於編譯器的編譯指示來管理此類布局,例如:

#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.

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