问题标签 [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 投票
7 回答
67516 浏览

c - 在 C 中使用灵活的数组成员是不好的做法吗?

我最近读到在 C 中使用灵活的数组成员是糟糕的软件工程实践。但是,该声明没有得到任何论据的支持。这是公认的事实吗?

灵活的数组成员是 C99 中引入的一项 C 功能,可以将最后一个元素声明为未指定大小的数组。例如:)

0 投票
5 回答
29692 浏览

c++ - 长度为零的数组

我正在重构一些旧代码,并发现很少有包含零长度数组的结构(如下)。当然,编译指示会抑制警告,但我未能通过包含此类结构的“新”结构创建(错误 2233)。数组'byData'用作指针,但为什么不使用指针呢?还是长度为 1 的数组?当然,没有添加任何评论来让我享受这个过程......有什么理由使用这样的东西吗?在重构这些方面有什么建议吗?

注意它是 C++、Windows XP、VS 2003

0 投票
4 回答
5325 浏览

c - C 结构中的灵活数组成员

引用 C-std 第 6.7.2.1 节,

这是一个有效的结构声明。我正在寻找这种语法的一些实际用途。准确地说,这个构造比保持 double* 作为第二个元素更强大或更弱?或者这是另一种“你可以以多种方式做到”的情况?

阿潘

0 投票
10 回答
32242 浏览

c++ - 灵活的数组成员在 C++ 中有效吗?

在 C99 中,您可以声明结构的灵活数组成员,如下所示:

但是,当工作人员试图在 C++ 中使用 clang 编译一些代码时,该语法不起作用。(它一直在使用 MSVC。)我们必须将其转换为:

翻阅 C++ 标准,我发现根本没有提到灵活的成员数组;我一直认为[0]这是一个无效的声明,但显然对于灵活的成员数组它是有效的。灵活的成员数组在 C++ 中真的有效吗?如果是这样,是正确的声明[]还是[0]

0 投票
2 回答
451 浏览

arrays - 动态数组和灵活数组

这两种类型的数组有什么区别,提前感谢从不同语言中获取的任何好例子

0 投票
2 回答
284 浏览

objective-c - 使用灵活长度数组时的Objective-C EXEC_BAD_ACCESS

我对我发现的一些行为进行了一些测试,我想知道是否有人可以帮助我了解发生了什么。

我有一个名为 的结构myStruct,它看起来像这样:

我在上面运行这段代码:

它工作正常。但是,当我将结构声明更改为此:

当我拨打该线路时,我得到 EXEC_BAD_ACCESS [a release]

谁能帮我理解这里发生了什么?

0 投票
2 回答
458 浏览

c - 创建大小为零的灵活数组成员是否合法?

C99 标准允许创建灵活的数组成员,例如

然后用类似的东西初始化它pstring* s = malloc(sizeof(pstring) + len)。是否允许len为零?它看起来是一致的,并且不时节省空间会很好(pstring当然,可能不是这个例子)。另一方面,我不知道下面的代码会做什么:

这似乎也可能适用于一个编译器而不是另一个编译器,或者在一个操作系统上而不是另一个,或者在某一天而不是另一天,所以我真正想知道的是标准对此有何规定。是malloc在示例代码中未定义的行为,还是只是对s->string无效的访问,还是完全是别的东西?

0 投票
2 回答
452 浏览

c++ - Objective-C++ 中 iOS 上的灵活数组成员

我正在研究一些核心音频代码,并且有一个问题可以通过结构中的变量数组来解决 - 即灵活数组成员。环顾四周,我发现有很多关于灵活成员阵列的可移植性和可行性的对话。

据我了解,Objective-C 符合 C99。出于这个原因,我认为灵活数组成员应该是一个很好的解决方案。我还看到灵活数组成员在 C++ 中不是一个好主意。

在 Objective-C++ 中做什么?从技术上讲,我不会在 Objective-C++ 中使用它。我正在编写基于 C 和 C++ 的回调......这似乎是一个反对点。

无论如何,我可以(我应该)这样做吗?如果没有,是否有另一种具有相同结果的技术?

0 投票
5 回答
319 浏览

c - 分配太少的空间是否安全(如果你知道你不需要它)?

因此,C99 祝福了常用的“灵活数组成员”hack,允许我们制作struct可以过度分配的 s 以满足我们的大小要求。我怀疑在大多数理智的实现中这样做是完全安全的,但是如果我们知道在某些情况下我们不需要 a 的某些成员,那么在 C 中“分配不足”是否合法struct

抽象例子

假设我有一个类型:

如果data_is_x,那么 的类型data是需要使用pos成员的类型。否则,使用 this 的函数将struct不需要. 本质上,携带有关它是否有成员的信息,并且此信息在 的生命周期内不会更改(在邪恶的恶作剧之外,无论如何都会破坏任何东西)。可以安全地说:posstructstructposstruct

pos只有在需要时才会为成员分配空间?或者它是否违反了使用对于指针来说太小的强制转换空间的约束struct,即使您从未使用过有问题的成员?

具体例子

我的实际用例有点涉及;它主要在这里,所以您可以理解我为什么要这样做:

for 的代码mylist_create指定 forsize > 0data一个连续数据数组,它是size项长(无论项可能是什么),但size == 0它是包含项的双向链表的当前节点。与 s 一起工作的所有功能mylist都会检查size == 0. 如果是这样,他们会将数据作为链表处理,其中“当前”索引是节点data指向的任何一个。如果没有,他们会将数据作为数组处理,其中“当前”索引存储在pos.

现在,如果size == 0我们真的不需要该pos成员,但如果size > 0我们需要的话。所以我的问题是,这样做是否合法:

如果我们保证(对未定义行为的惩罚), while size == 0,我们将永远不会尝试(或需要)访问该pos成员?或者它是否在标准中的某个地方说它是 UB 甚至考虑这样做?

0 投票
3 回答
30036 浏览

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

我有以下结构

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

例如:对于普通结构,如

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

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

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

(或者)

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