将一个整数结构转换为一个整数数组

标签 c arrays struct

我正在使用一个库,该库具有一个接受结构数组的函数。该结构和函数具有以下布局:

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 保证了一些关于结构填充的事情:

  1. 成员不会被重新排序
  2. 填充只会在具有不同对齐方式的成员之间或结构的末尾添加
  3. 指向结构的指针指向与指向其第一个成员的指针相同的内存位置
  4. 每个成员都以适合其类型的方式对齐
  5. 为了实现对齐,结构中可能有未命名的空洞

据此我可以推断 ab 之间没有填充。但是,该结构可能会在末尾进行填充。我对此表示怀疑,因为它在 32 位和 64 位系统上都是字对齐的。有人对此有更多信息吗?

最佳答案

该实现可以自由填充结构 - ab 之间可能有未使用的字节。但是可以保证第一个成员不会从结构的开头偏移。

通常,您使用特定于编译器的编译指示来管理此类布局,例如:

#pragma pack(push)
#pragma pack(1)
struct TwoInt32s
{
  int32_t a;
  int32_t b;
};
#pragma pack(pop)

关于将一个整数结构转换为一个整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5381270/

相关文章:

c++ - 使用 Win32 API 读取用户指定的文件

c - C 中的宏指令——我的代码示例不起作用

c - 形参1的类型不完整

c - 如何使用灵活的数组成员初始化结构

创建一个创建结构体实例的数组

Java 和 C : different outputs of same code

用 c 编写 bash : don't understand how to implement the pipes

javascript - 合并2个数组的对象

PHP:数组可以有一个数组作为键值对中的键吗?

ios - 我需要一个可变数组,它在 IOS 中有 8 个内插字符串