问题标签 [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 中使用灵活的数组成员是不好的做法吗?
我最近读到在 C 中使用灵活的数组成员是糟糕的软件工程实践。但是,该声明没有得到任何论据的支持。这是公认的事实吗?
(灵活的数组成员是 C99 中引入的一项 C 功能,可以将最后一个元素声明为未指定大小的数组。例如:)
c++ - 长度为零的数组
我正在重构一些旧代码,并发现很少有包含零长度数组的结构(如下)。当然,编译指示会抑制警告,但我未能通过包含此类结构的“新”结构创建(错误 2233)。数组'byData'用作指针,但为什么不使用指针呢?还是长度为 1 的数组?当然,没有添加任何评论来让我享受这个过程......有什么理由使用这样的东西吗?在重构这些方面有什么建议吗?
注意它是 C++、Windows XP、VS 2003
c - C 结构中的灵活数组成员
引用 C-std 第 6.7.2.1 节,
这是一个有效的结构声明。我正在寻找这种语法的一些实际用途。准确地说,这个构造比保持 double* 作为第二个元素更强大或更弱?或者这是另一种“你可以以多种方式做到”的情况?
阿潘
c++ - 灵活的数组成员在 C++ 中有效吗?
在 C99 中,您可以声明结构的灵活数组成员,如下所示:
但是,当工作人员试图在 C++ 中使用 clang 编译一些代码时,该语法不起作用。(它一直在使用 MSVC。)我们必须将其转换为:
翻阅 C++ 标准,我发现根本没有提到灵活的成员数组;我一直认为[0]
这是一个无效的声明,但显然对于灵活的成员数组它是有效的。灵活的成员数组在 C++ 中真的有效吗?如果是这样,是正确的声明[]
还是[0]
?
arrays - 动态数组和灵活数组
这两种类型的数组有什么区别,提前感谢从不同语言中获取的任何好例子
objective-c - 使用灵活长度数组时的Objective-C EXEC_BAD_ACCESS
我对我发现的一些行为进行了一些测试,我想知道是否有人可以帮助我了解发生了什么。
我有一个名为 的结构myStruct
,它看起来像这样:
我在上面运行这段代码:
它工作正常。但是,当我将结构声明更改为此:
当我拨打该线路时,我得到 EXEC_BAD_ACCESS [a release]
。
谁能帮我理解这里发生了什么?
c - 创建大小为零的灵活数组成员是否合法?
C99 标准允许创建灵活的数组成员,例如
然后用类似的东西初始化它pstring* s = malloc(sizeof(pstring) + len)
。是否允许len
为零?它看起来是一致的,并且不时节省空间会很好(pstring
当然,可能不是这个例子)。另一方面,我不知道下面的代码会做什么:
这似乎也可能适用于一个编译器而不是另一个编译器,或者在一个操作系统上而不是另一个,或者在某一天而不是另一天,所以我真正想知道的是标准对此有何规定。是malloc
在示例代码中未定义的行为,还是只是对s->string
无效的访问,还是完全是别的东西?
c++ - Objective-C++ 中 iOS 上的灵活数组成员
我正在研究一些核心音频代码,并且有一个问题可以通过结构中的变量数组来解决 - 即灵活数组成员。环顾四周,我发现有很多关于灵活成员阵列的可移植性和可行性的对话。
据我了解,Objective-C 符合 C99。出于这个原因,我认为灵活数组成员应该是一个很好的解决方案。我还看到灵活数组成员在 C++ 中不是一个好主意。
在 Objective-C++ 中做什么?从技术上讲,我不会在 Objective-C++ 中使用它。我正在编写基于 C 和 C++ 的回调......这似乎是一个反对点。
无论如何,我可以(我应该)这样做吗?如果没有,是否有另一种具有相同结果的技术?
c - 分配太少的空间是否安全(如果你知道你不需要它)?
因此,C99 祝福了常用的“灵活数组成员”hack,允许我们制作struct
可以过度分配的 s 以满足我们的大小要求。我怀疑在大多数理智的实现中这样做是完全安全的,但是如果我们知道在某些情况下我们不需要 a 的某些成员,那么在 C 中“分配不足”是否合法struct
?
抽象例子
假设我有一个类型:
如果data_is_x
,那么 的类型data
是需要使用pos
成员的类型。否则,使用 this 的函数将struct
不需要. 本质上,携带有关它是否有成员的信息,并且此信息在 的生命周期内不会更改(在邪恶的恶作剧之外,无论如何都会破坏任何东西)。可以安全地说:pos
struct
struct
pos
struct
pos
只有在需要时才会为成员分配空间?或者它是否违反了使用对于指针来说太小的强制转换空间的约束struct
,即使您从未使用过有问题的成员?
具体例子
我的实际用例有点涉及;它主要在这里,所以您可以理解我为什么要这样做:
for 的代码mylist_create
指定 forsize > 0
是data
一个连续数据数组,它是size
项长(无论项可能是什么),但size == 0
它是包含项的双向链表的当前节点。与 s 一起工作的所有功能mylist
都会检查size == 0
. 如果是这样,他们会将数据作为链表处理,其中“当前”索引是节点data
指向的任何一个。如果没有,他们会将数据作为数组处理,其中“当前”索引存储在pos
.
现在,如果size == 0
我们真的不需要该pos
成员,但如果size > 0
我们需要的话。所以我的问题是,这样做是否合法:
如果我们保证(对未定义行为的惩罚), while size == 0
,我们将永远不会尝试(或需要)访问该pos
成员?或者它是否在标准中的某个地方说它是 UB 甚至考虑这样做?
c - 如何使用灵活的数组成员初始化结构
我有以下结构
我已经完成了一些基本的互联网搜索(但未成功),了解如何创建实例并使用灵活的数组成员初始化结构而不使用malloc()
.
例如:对于普通结构,如
我们可以创建一个实例struct a
并像这样初始化它
但是对于其中具有灵活数组的结构(_person
如上所述),我们如何创建一个实例并像我们正常的那样进行初始化structures
?
甚至可能吗?如果是这样,我们如何在初始化期间传递数组大小和要初始化的实际值?
(或者)
真的,创建具有灵活数组的结构的唯一方法是使用malloc()
C99 规范中提到的 - 6.7.2.1 Structure and union specifiers - point #17
?!