问题标签 [flexible-array-member]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
46 浏览

c - 初始化结构并通过引用传递

我对C相当陌生,并且在使用结构时遇到了麻烦。我有以下代码:

现在这个程序的输出是:

为什么这些值不是我初始化它们的值?我在这里想念什么?

0 投票
2 回答
72 浏览

c - 应该使用宏而不是灵活的数组成员吗?

让我们假设以下内容:

我想为UDP 数据包创建一个结构。每个帧通常由以太网头、IP 头、UDP 头和可选的有效载荷组成,最后是 FCS(帧校验和序列)。
有效载荷长度未知/灵活。这意味着在创建结构时,有效负载必须是它的最后一个成员(灵活数组成员)。因此,FCS 没有立足之地。

所以我想到了还有哪些可能性。

我想出了以下代码:

因为这是不允许的:

我的问题:这是我必须在结构中包含 FCS 而没有固定数组(有效负载)大小的唯一可能性吗?

如果是这样,这是一个好的解决方案吗?这被认为是好的做法吗?

0 投票
1 回答
50 浏览

struct - Arduino 是否支持 struct hack 或类似的解决方案来代替灵活的数组元素?

我为儿子编写了一个 Arduino 项目,并在此过程中了解了 C。一切正常,但是在将代码分成十个文件并将变量分组到每个文件中的结构之后,我无法解决一个清晰的愿望。我们需要凭经验确定用于存储和平均端口读取的数组的最佳大小,所以这就是我想要的:

这很简单,但不起作用。我尝试了灵活的数组成员,直到发现 C++ 不支持该功能。Arduino 使用 C++ 编译。我尝试了许多“结构黑客”的例子,但它们都返回了这样的错误:

这看起来很有希望,但我怀疑我的无知正在发光。大多数 struct hack 示例都要求声明 struct 并稍后初始化 struct 变量。我希望不要复制结构。

我考虑过拆分结构,但这很容易出错,而且还有另一个编译错误:

另一种方法是调整数组大小并稍后获取大小,但需要解释:

有没有办法在 Arduino 中使用 struct hack 或一些类似的解决方案来实现第一个示例?

0 投票
1 回答
954 浏览

c - 灵活数组成员的使用无效(与其他成员不同)

所以我有这两个结构:

我想这样做:

但我在这里收到错误“无效使用灵活数组成员”:

据我所知,我正在分配所需的空间,这就是为什么我不明白问题所在。

我又看到了 2 篇具有此标题的帖子,但没有一个能解决我的问题,因为我已经尝试了这些问题的答案。

0 投票
4 回答
1009 浏览

c++ - 包含 char 数组的结构体

我正在尝试定义一个结构的实例,并且在设置这个变量时遇到了特别的麻烦。它是一个 char 数组。

这是我的头文件中的结构...

这是我试图设置widget_t结构的实例......

因此,当我尝试将昵称放入SomeWidget.nicknames. 我不确定我是否需要做一些时髦的事情,就像我正在做name的指针一样......?

棘手的一点是数量nicknames是可变的。因此,每个实例都希望设置不同数量的它们。

0 投票
1 回答
201 浏览

c++ - 将灵活数组包装在匿名结构中时,MSVC 结构布局会发生变化吗?

我正在使用 godbolt查看以下结构的布局信息:

我希望这两个结构的布局Foo1Foo2相同的。据我了解,匿名嵌套结构的任何字段都只是“折叠”到父结构中。所以 的布局Foo2应该与 的布局相同Foo1

但是,MSVC 19.16 生成的布局以及使用标志时显示的布局/d1reportSingleClassLayoutFoo不同:

Foo2是 的两倍大小Foo1data突然似乎有1个字节的大小。

产生了一些警告-Wall

但这些似乎都不能解释布局的差异,或暗示未定义的行为。而且,文档也没有:匿名结构

作为记录,我确实知道这段代码依赖于 MSVC 扩展:

“零大小数组”data似乎是一个灵活的数组成员,因为将它放在size字段之前会引发错误。

为什么布局Foo1Foo2不同?

0 投票
2 回答
177 浏览

c - 分配连续内存以包含具有灵活数组成员的多个结构

考虑一个包含灵活数组成员的结构,如下所示:

我有一个未知数量的 Foo,每个都是未知大小,但是我可以确定我所有的 Foo 加起来正好是 1024 字节。如何在知道每个 Foo 的长度之前为一个 Foos 数组分配 1024 个字节,然后再填充该数组的成员?

像这样的东西,虽然它抛出了一个段错误:

想要这样做的原因是将所有 Foos 保持在一个连续的内存区域中,以便 CPU 缓存友好。

0 投票
2 回答
112 浏览

c - 灵活数组成员中的严格别名?

我正在编写一个 Arena Allocator 并且它可以工作,但我觉得它违反了严格的别名规则。我想知道我是对还是错。这是代码的相关部分:

Arena 是 Nodes 的链表, Node 是一个 header,后跟 data u8 data[]。u8 是无符号字符。我维护下一个可用索引 ( currentIndex) 并按此索引前进data并将其作为void *( ptr = &a->current->data[a->currentIndex]) 返回。这是否违反了严格的别名规则,因为我正在将指针转换u8为其他东西并使用它?

我的困惑来自于 malloc 返回的内存没有有效类型。但是由于我将 malloc 的指针投射到并在分配它(in)之后ArenaNode *设置它的数据成员(nextand ) ,所以有效类型变为. 或者是吗?我没有设置那个字段。 dataSizeArenaNodeNewArenaNodedata

基本上,我认为问题可以简化为:如果我 malloc 内存区域的大小为 10,将指针转换为struct {int a;} *(假设 4 个字节 int),将其设置a为某个值,其余 6 个字节会发生什么情况?它有任何有效的类型吗?灵活数组成员的存在是否会以任何方式影响这一点?

0 投票
3 回答
604 浏览

c - C中的灵活数组的灵活数组

是否可以在 C 中使用嵌套的灵活数组(灵活数组的灵活数组)?

我尝试了以下代码来测试灵活数组:

输出是:

这里的一切都和预期的一样好。分配的空间为set28字节。

但是当我尝试像这样修改此代码以将灵活数组放入其他数组时:

分配的空间为set20字节,输出错误:

即使我malloc手动设置为任何合理的值,输出仍然不正确。我认为这是因为编译器不知道group[]顶层结构(obj)中成员的大小。但是我没有收到任何编译器错误或警告(GCC 6.3.0)。

而且我不知道如何设置此大小并使编译器正确处理此代码。

0 投票
2 回答
189 浏览

c - 如何将两个灵活的数组放在一个结构中?

我是编程和学习结构的新手,当试图将两个灵活的数组放在一个结构中时,他们给了我一个错误,为什么我不能把两个数组放在一个结构中?我创建了一个 pokemon 示例来测试 struct 中的数组,但只有 *pokemon_name[] 有效,为什么?