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

c - 收到以下警告:使用灵活数组成员传递结构的 ABI 在 GCC 4.4 中已更改

当我尝试运行我的程序时,我收到了这个警告和一些奇怪的错误。 rmi_pdu在以下结构中包含我要访问的可变大小的数组。

问题是当我试图释放我动态分配的内存时。内容在那里,但free()API 正在abort()运行。这就是核心的样子

这就是分配的样子。想要使用 rmi 的调用者会将大小作为参数传递。

len作为参数传递。

0 投票
1 回答
187 浏览

c - 使用灵活数组成员的奇怪行为

我尝试使用更接受的习语将结构的 void* 成员替换为灵活的数组成员:

然后我将条目添加到一个连续的内存块中:

像这样:

问题是一旦我需要它就解压这些数据。例如,如果我这样做:

这可能是有原因的吗?我不一定认为我在任何地方都踩着东西,它曾经与 void* 方法一起使用。奇怪的是,如果我将一个虚拟 void* 放回结构中,它就可以工作。如果我放入一个虚拟 int 它将不起作用。

编辑:实际上,如果numberinAddEntry不是 0,它也会失败。我踩的是什么,如果有的话?

0 投票
2 回答
1986 浏览

c - 灵活的数组成员(零长度数组)

参考GCC 的零长度数组解释:

这在结构是可变长度对象的标头的情况下特别有用。这正是我的情况。此外,我关心堆中结构的对齐方式。

在这种情况下,我仍然真的不明白零长度数组有什么用处。它们与这种特殊情况有什么关系?

编辑:

是不是我可以在里面放多少我想要的“数据”?

0 投票
1 回答
1006 浏览

c - 在另一个结构中具有灵活数组成员的结构

下面的代码是否有效?

对我来说似乎没问题,但我有点怀疑,因为如果我这样做编译器不会抱怨:

0 投票
3 回答
325 浏览

c++ - 是否可以编写具有零长度数组成员的“完整”C++ 类?

我有一些数据类型,如果我使用普通的旧 C,将被实现为

我想做的,基本上是把它变成一个,并添加常用的运算符,如lessequalcopy constructoroperator assignment等。正如您可以想象的那样,我将在std::map等关联容器中使用此类作为其key

我需要缓冲区在理想情况下与对象本身处于同一级别,否则当我必须比较其中两个(缓冲区)时,我会让 CPU 获取指针并将其加载到内存中;我不想使用std::vector因为分配的内存不会与其余的数据成员连续。

对我来说主要问题是在C 语言中我会有一个函数,给定缓冲区的大小,它会为其分配适当的内存大小。在C++中,这样的事情是做不到的。

我对吗?干杯

0 投票
2 回答
2983 浏览

c - 使用灵活的数组成员分配结构

这是 C99 代码:

现在,我该如何分配内存?

或者

?

甚至可以保证在sizeof具有灵活数组成员的类型上工作(GCC 接受它)?

0 投票
5 回答
10432 浏览

c - 零元素的数组需要什么?

在 Linux 内核代码中,我发现了以下我无法理解的内容。

代码在这里: http: //lxr.free-electrons.com/source/include/linux/ti_wilink_st.h

零元素数据数组的需求和目的是什么?

0 投票
2 回答
337 浏览

c++ - c++ 结构中的运行时大小的数组

在 C(使用 gcc)中,我曾经有一些数据结构是一个包含一些额外信息的数组:

Iirc,这被称为“灵活数组”(http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html#Zero-Lengthmalloc(sizeof(song)+N*sizeof(note)) ),然后我可以在运行时分配一首包含 N 个音符的歌曲。如果我这次不打算使用向量,也不打算在中引入无用的note*指针,那么 g++ 支持到什么程度song

0 投票
5 回答
3135 浏览

c++ - 使用模板和基类实现灵活的数组成员

在 C99 中,您通常会看到以下模式:

但这不仅是糟糕的 C++,而且也是非法的。

您可以在 C++ 中实现类似的效果,如下所示:

虽然这会起作用(在 FooBase 的方法中,您可以访问var2[2],var2[3]等),但它依赖于Foo标准布局,这不是很漂亮。

这样做的好处是,非模板化函数可以通过采用 a和调用对 进行操作的方法来接收任何Foo*内容而无需转换,并且内存都是连续的(这可能很有用)。FooBase*var2

有没有更好的方法来实现这一点(这是合法的 C++/C++11/C++14)?

我对这两个微不足道的解决方案不感兴趣(包括基类中指向数组开头的额外指针,以及在堆上分配数组)。

0 投票
2 回答
2284 浏览

c - 灵活的数组成员真的有必要吗?

显然,具有灵活数组成员的结构不打算被声明,而是与指向该结构的指针一起使用。声明一个灵活数组成员时,必须至少有一个其他成员,并且该灵活数组成员必须是该结构中的最后一个成员。

假设我有一个看起来像这样的:

然后要使用它,我必须声明一个指针并使用 malloc 为结构的内容保留内存。

也就是说,如果我希望我的 flm[] 数组保存五个整数。然后,我可以像这样使用我的结构:

我的问题是,我不应该只使用指针而不是这个吗?它不仅兼容 C99 之前的版本,而且我可以在有或没有指向该结构的指针的情况下使用它。考虑到我已经必须在 flm 中使用 malloc,难道我不应该这样做吗?

考虑一下示例结构的这个新定义;

我什至可以像灵活数组成员一样使用替换:

这也行吗?(用notflm提供了上面例子的定义)