问题标签 [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.
c - 初始化结构并通过引用传递
我对C相当陌生,并且在使用结构时遇到了麻烦。我有以下代码:
现在这个程序的输出是:
为什么这些值不是我初始化它们的值?我在这里想念什么?
struct - Arduino 是否支持 struct hack 或类似的解决方案来代替灵活的数组元素?
我为儿子编写了一个 Arduino 项目,并在此过程中了解了 C。一切正常,但是在将代码分成十个文件并将变量分组到每个文件中的结构之后,我无法解决一个清晰的愿望。我们需要凭经验确定用于存储和平均端口读取的数组的最佳大小,所以这就是我想要的:
这很简单,但不起作用。我尝试了灵活的数组成员,直到发现 C++ 不支持该功能。Arduino 使用 C++ 编译。我尝试了许多“结构黑客”的例子,但它们都返回了这样的错误:
这看起来很有希望,但我怀疑我的无知正在发光。大多数 struct hack 示例都要求声明 struct 并稍后初始化 struct 变量。我希望不要复制结构。
我考虑过拆分结构,但这很容易出错,而且还有另一个编译错误:
另一种方法是调整数组大小并稍后获取大小,但需要解释:
有没有办法在 Arduino 中使用 struct hack 或一些类似的解决方案来实现第一个示例?
c - 灵活数组成员的使用无效(与其他成员不同)
所以我有这两个结构:
我想这样做:
但我在这里收到错误“无效使用灵活数组成员”:
据我所知,我正在分配所需的空间,这就是为什么我不明白问题所在。
我又看到了 2 篇具有此标题的帖子,但没有一个能解决我的问题,因为我已经尝试了这些问题的答案。
c++ - 包含 char 数组的结构体
我正在尝试定义一个结构的实例,并且在设置这个变量时遇到了特别的麻烦。它是一个 char 数组。
这是我的头文件中的结构...
这是我试图设置widget_t
结构的实例......
因此,当我尝试将昵称放入SomeWidget.nicknames
. 我不确定我是否需要做一些时髦的事情,就像我正在做name
的指针一样......?
棘手的一点是数量nicknames
是可变的。因此,每个实例都希望设置不同数量的它们。
c++ - 将灵活数组包装在匿名结构中时,MSVC 结构布局会发生变化吗?
我正在使用 godbolt查看以下结构的布局信息:
我希望这两个结构的布局Foo1
是Foo2
相同的。据我了解,匿名嵌套结构的任何字段都只是“折叠”到父结构中。所以 的布局Foo2
应该与 的布局相同Foo1
。
但是,MSVC 19.16 生成的布局以及使用标志时显示的布局/d1reportSingleClassLayoutFoo
不同:
Foo2
是 的两倍大小Foo1
。data
突然似乎有1个字节的大小。
产生了一些警告-Wall
:
但这些似乎都不能解释布局的差异,或暗示未定义的行为。而且,文档也没有:匿名结构。
作为记录,我确实知道这段代码依赖于 MSVC 扩展:
“零大小数组”data
似乎是一个灵活的数组成员,因为将它放在size
字段之前会引发错误。
为什么布局Foo1
和Foo2
不同?
c - 分配连续内存以包含具有灵活数组成员的多个结构
考虑一个包含灵活数组成员的结构,如下所示:
我有一个未知数量的 Foo,每个都是未知大小,但是我可以确定我所有的 Foo 加起来正好是 1024 字节。如何在知道每个 Foo 的长度之前为一个 Foos 数组分配 1024 个字节,然后再填充该数组的成员?
像这样的东西,虽然它抛出了一个段错误:
想要这样做的原因是将所有 Foos 保持在一个连续的内存区域中,以便 CPU 缓存友好。
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 *
设置它的数据成员(next
and ) ,所以有效类型变为. 或者是吗?我没有设置那个字段。 dataSize
ArenaNodeNew
ArenaNode
data
基本上,我认为问题可以简化为:如果我 malloc 内存区域的大小为 10,将指针转换为struct {int a;} *
(假设 4 个字节 int),将其设置a
为某个值,其余 6 个字节会发生什么情况?它有任何有效的类型吗?灵活数组成员的存在是否会以任何方式影响这一点?
c - C中的灵活数组的灵活数组
是否可以在 C 中使用嵌套的灵活数组(灵活数组的灵活数组)?
我尝试了以下代码来测试灵活数组:
输出是:
这里的一切都和预期的一样好。分配的空间为set
28个字节。
但是当我尝试像这样修改此代码以将灵活数组放入其他数组时:
分配的空间为set
20字节,输出错误:
即使我malloc
手动设置为任何合理的值,输出仍然不正确。我认为这是因为编译器不知道group[]
顶层结构(obj
)中成员的大小。但是我没有收到任何编译器错误或警告(GCC 6.3.0)。
而且我不知道如何设置此大小并使编译器正确处理此代码。
c - 如何将两个灵活的数组放在一个结构中?
我是编程和学习结构的新手,当试图将两个灵活的数组放在一个结构中时,他们给了我一个错误,为什么我不能把两个数组放在一个结构中?我创建了一个 pokemon 示例来测试 struct 中的数组,但只有 *pokemon_name[] 有效,为什么?