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

2024-04-14

我有以下结构

typedef struct _person {
    int age;
    char sex;
    char name[];
}person;

我已经做了一些基本的互联网搜索(但不成功),了解如何创建实例并使用灵活的数组成员初始化结构而不使用malloc().

例如:对于正常结构,如

struct a {
    int age; 
    int sex;
};

我们可以创建一个实例struct a并像这样初始化它

struct a p1 = {10, 'm'};

但对于其中具有灵活数组的结构(例如_person如上所述)我们如何创建一个实例并像正常情况一样进行初始化structures?

有可能吗?如果是这样,我们如何在初始化期间传递数组大小和要初始化的实际值?

(or)

创建具有灵活数组的结构的唯一方法是使用malloc()正如 C99 规范中提到的 -6.7.2.1 Structure and union specifiers - point #17?!


不,灵活数组必须始终手动分配。但你可以使用calloc初始化灵活部分和复合文字来初始化固定部分。我会把它包装在分配中inline像这样的函数:

typedef struct person {
  unsigned age;
  char sex;
  size_t size;
  char name[];
} person;

inline
person* alloc_person(int a, char s, size_t n) {
  person * ret = calloc(sizeof(person) + n, 1);
  if (ret) memcpy(ret,
                  &(person const){ .age = a, .sex = s, .size = n},
                  sizeof(person));
  return ret;
}

请注意,这会将分配是否成功的检查留给调用者。

如果你不需要size当我将其包含在此处时,宏甚至就足够了。只是无法检查返回calloc在做之前memcpy。在我到目前为止编写的所有系统下,这都会相对较好地中止。一般来说我认为返回的malloc是次要的 http://gustedt.wordpress.com/2011/11/05/chasing-a-phantom-checking-the-return-of-malloc/,但在这个问题上意见分歧很大。

这也许(在这种特殊情况下)为优化器提供更多机会将代码集成到周围环境中:

#define ALLOC_PERSON(A,  S,  N)                                 \
((person*)memcpy(calloc(sizeof(person) + (N), 1),               \
                 &(person const){ .age = (A), .sex = (S) },     \
                 sizeof(person)))

Edit:这可能比函数更好的情况是A and S是编译时间常数。在这种情况下,复合文字,因为它是const合格的,可以静态分配,并且其初始化可以在编译时完成。此外,如果代码中出现多个具有相同值的分配,则编译器将只能实现该复合文字的一个副本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用灵活的数组成员初始化结构 的相关文章

随机推荐

  • Oracle设置默认NLS_LANG

    我在 RHEL6 上运行 Oracle 数据库 11g 如果没有客户端NLS LANG 则设置某些utf8字符的长度为2 设置NLS LANG AMERICAN AMERICA UTF8后 长度仅为1 如何更改整个数据库的默认 NLG LA
  • 静态变量的线程安全初始化

    我一直在使用这种模式来初始化类中的静态数据 对我来说 它看起来是线程安全的 但我知道线程问题有多么微妙 这是代码 public class MyClass bad code do not use static string myResour
  • Jasmine:测试 setTimeout 函数抛出错误

    我想测试一个方法的错误处理 该方法使用 setTimeout 安排工作 该错误将在预定部分抛出 即 function sutWithSetTimeout setTimeout function throw new Error pang 1
  • `scipy.ndimage.zoom` 与 `order=0` 的 `skimage.transform.rescale`

    我正在创建一个彩色灰度图像来显示图像块的分类 我需要使用零阶对低分辨率分类图像进行上采样以匹配原始图像大小 When I use skimage transform rescale I 16 order 0 I get the desire
  • Vue.js $children 按组件名称

    我正在尝试按名字访问特定的孩子 目前 由于孩子所在的位置 我这样称呼孩子 this root children 0 没关系 只要那个孩子总是 0 但如果有一种方法可以做类似的事情那就太好了 this root children detail
  • Expo 应用程序:任何导航器均未处理“TOGGLE_DRAWER”操作

    我试图从 MealsNavigator 导航中显示一个抽屉 到目前为止 我导入了 ff 必需品 import React from react import NavigationContainer from react navigation
  • 将此字符串转换为时间戳 PHP [重复]

    这个问题在这里已经有答案了 我有这个字符串 13 10 15 00 我想将其转换为时间戳 但是当我这样做时 timestamp strtotime 13 10 15 00 它返回一个空值 在你的代码中strtotime 正在尝试转换13 1
  • 从单线程进行 COM 调用会挂起线程

    我有一个应用程序 可以通过自动化插件执行一些 Excel 自动化操作 该加载项是多线程的 所有线程都设法调用 Excel COM 对象 由于 Excel 在进行多次调用时有时会返回 忙 异常 因此我将所有调用包装在 重试 函数中 但我觉得这
  • 如何从 page.open 发出的请求中查看 HTTP 状态代码?

    我有一个 phantomJS 脚本 其中包含以下内容 page open url function status if status fail handle failure 状态检查有时会起作用 但即使请求返回 500 状态仍然是 成功 如
  • 如何使用 jQuery 的 $.ajax() 函数来运行 php 脚本? [复制]

    这个问题在这里已经有答案了 为了使这一点易于理解 我制作了一个示例代码 因为我的实际代码要大得多 基本上我想要完成的是运行我的 PHP 脚本 使用 ajax 编辑 XML 文件 这是因为我需要在我的实际项目中的 javascript 中执行
  • 使用 12 GB 内存运行 Dart

    I am using 16 GB RAM on my Pc This started happening while working without any reason as far as I no This always happens
  • docker compose MySQL 容器 [2002] 连接被拒绝

    我正在尝试为 Nginx PHP Laravel MySQL 构建 docker compose 容器 但我不断收到连接被拒绝错误 docker compose yml version 3 services nginx image ngin
  • Laravel 带有约束的急切加载

    所以我的模型有两个简单的关系 然后急切加载就像这样完美地工作 Entry with author lastModifiedBy gt 但是假设我想添加一个带有约束的新关系 例如 public function foo return this
  • iOS SDK Hue 飞利浦与 Swift

    我尝试在 Objective C 中为 Hue 导入 iOS SDK 我按照这里的说明进行操作 https github com PhilipsHue PhilipsHueSDK iOS OSX https github com Phili
  • 为什么 Camera.setParameters(Camera.Parameters) 不适用于索尼爱立信 X10 和 Droid?

    在索尼爱立信 X10 或 Droid 上使用相机 API 时 有人遇到过奇怪的行为吗 例如 以下代码不适用于这些设备 结果 我在市场上收到了很多负面反馈 导致许多订单被取消 mParameters set rotation orientat
  • 我可以向内置 Python 类型添加自定义方法/属性吗?

    例如 假设我想添加一个helloWorld Python 的 dict 类型的方法 我可以这样做吗 JavaScript 有一个以这种方式运行的原型对象 也许这是糟糕的设计 我应该对 dict 对象进行子类化 但它只适用于子类 我希望它适用
  • 编写每个三角形/面具有纯色的 GLSL 片段着色器的方法

    我有顶点和三角形数据 其中包含每个数据的颜色triangle 面 不是每个顶点 即单个顶点由多个面共享 每个面可能具有不同的颜色 我应该如何在 GLSL 中解决这个问题以获得每个的纯色分配face正在渲染 通过平均顶点相邻多边形的颜色来计算
  • 设置任意深度的嵌套列表样式

    我想知道是否可以仅使用 CSS 来设置嵌套无序列表的样式 而不使用任何脚本 问题是 CSS 需要适用于列表树的任何深度 例如 我有一个列表 ul li Item 1 li li Item 2 li li Item 3 li li class
  • 在 Mocha 中处理未随 npm 安装的依赖项?

    我有一个正在运行的 Node 应用程序 我正在尝试添加 Mocha 测试 但遇到了一些奇怪的导入错误 这是我的文件结构 package json index js src chart js test test chart js 这就是我的c
  • 如何使用灵活的数组成员初始化结构

    我有以下结构 typedef struct person int age char sex char name person 我已经做了一些基本的互联网搜索 但不成功 了解如何创建实例并使用灵活的数组成员初始化结构而不使用malloc 例如