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

c - 如何在 rodata 中初始化一个灵活的数组并创建一个指向它的指针?

在 C 中,代码

存储Hello world!\0在rodata中并c使用指向它的指针进行初始化。我怎么能用字符串以外的东西来做到这一点?

具体来说,我正在尝试定义自己的字符串类型

然后想要某种宏,这样我就可以说

并让它表现相同,因为\x0c\0\0\0Hello world!它存储在rodata中并c2用指向它的指针进行初始化。

我尝试使用

正如这些 问题中所建议的那样,但它不起作用,因为它Data是一个灵活的数组:我得到了错误error: non-static initialization of a flexible array member(使用 gcc,clang 给出了类似的错误)。

这在C中可能吗?如果是这样,PASCAL_STRING_CONSTANT宏会是什么样子?

澄清

对于 C 字符串,以下代码块永远不会将字符串存储在堆栈中:

正如我们通过查看程序集所看到的,第 5 行编译为仅将指针加载到寄存器中。

我希望能够使用 pascal 字符串获得相同的行为,并且可以使用 GNU 扩展。以下代码也从不将帕斯卡字符串存储在堆栈中:

查看其生成的程序集,第 18 行也只是加载了一个指针。

但是,我发现在 ANSI C 中执行此操作的最佳代码会生成将整个字符串复制到堆栈的代码:

为此代码生成的程序集中,第 19 行将整个结构复制到堆栈上,然后生成指向它的指针。

我正在寻找生成与我的第二个示例相同的程序集的 ANSI C 代码,或者解释为什么 ANSI C 不可能。

0 投票
2 回答
314 浏览

c - 是否允许返回具有灵活数组成员的结构?

GCC 编译函数返回一个具有灵活数组成员的结构。该标准在 6.7.2.1 中给出了如何处理此类结构的定义:

在大多数情况下,灵活数组成员被忽略。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾随填充。

由于具有灵活数组成员的结构的大小是已知的,因此根据 6.2.5 中给出的完整性定义,该类型是完整的:

在翻译单元内的不同点,对象类型可能是不完整的(缺乏足够的信息来确定该类型对象的大小)或完整的(具有足够的信息)。37)

另外,6.5.2.2

表示被调用函数的表达式 96) 应具有指向返回 void 或返回数组类型以外的完整对象类型的函数的类型指针。

所以struct用灵活的数组成员返回 s 应该是合法的。


如何修复下面的示例以使其正常工作(我需要具有灵活数组成员的堆栈分配结构):

0 投票
2 回答
257 浏览

c - 结构中动态数组的内存损坏?

所以我有这两个结构。只需要担心这三个变量;name_size、name 和 xattrs[0]。

首先我更新 xattrs 中的索引 0

输出是;

然后我尝试更新第二个索引。

更新“name_size”变量后,先前索引中的“name”值立即被删除。

知道为什么会这样吗?

0 投票
1 回答
190 浏览

c - 具有灵活数组成员的结构的“数组”

我正在重写一些具有结构数组的旧代码,每个结构都有一个长度在编译时固定的数组成员。外部数组中的结构数量在编译时确定以适合(典型)内存页面。我想在运行时使内部数组变量,但保持“外部数组适合页面”逻辑完整(并用于sysconf(_SC_PAGESIZE)精确获取页面大小)。所以我的结构有一个灵活的数组成员

我想要这些东西的数组,但当然这是不允许的。但是所有这些结构都将具有相同大小的灵活数组成员(由运行时确定),所以我可以使用它们的“数组”来代替吗?也就是说,有char *足够的空间来容纳其中的n 个,自己进行偏移量计算,并将指针偏移量转换为foo_t *然后访问、修改等。

我的目标是 C99、C11。

0 投票
1 回答
1100 浏览

c++ - 作为类成员的灵活数组

GCC G++ 9

这段代码:

产生关于灵活数组的初始化程序的错误。但是这个:

正常编译。不计算我输入的值的任何解决方法?

0 投票
1 回答
82 浏览

c - 比较 2 个指向具有灵活数组成员的结构的指针

问题:将 2 个指针与灵活的数组成员进行比较是否大于(小于)和相等?


以下是struct inotify_event在 Linux 中声明的方式:

为简单起见省略大小检查,让我们考虑以下代码:

我认为指向包含灵活数组成员的结构的指针的比较始终是 UB(即使它们相同)

N2346/6.7.2.1p3(雇员我的):

具有多个命名成员的结构的最后一个成员可能具有不完整的数组类型;这样的结构(以及可能递归地包含这样的结构的成员的任何联合) 不应是结构的成员或数组的元素

OTOH,N2346/6.5.8p5需要比较的指针属于同一个数组:

比较两个指针时,结果取决于所指向对象在地址空间中的相对位置。如果指向对象类型的两个指针都指向同一个对象,或者都指向同一个数组对象的最后一个元素,它们比较相等。如果指向的对象是同一个聚合对象的成员,则指向稍后声明的结构成员的指针比较大于指向结构中较早声明的成员的指针,并且指向具有较大下标值的数组元素的指针比较大于指向同一数组的元素的指针具有较低的下标值。所有指向同一个联合对象成员的指针比较相等。如果表达式 P 指向一个数组对象的一个​​元素,而表达式 Q 指向同一个数组对象的最后一个元素,指针表达式 Q+1 比较大于 P 。在所有其他情况下,行为是未定义的。

OTOOH,我发现N2346/6.5.8p4与具有灵活数组成员的结构的定义相矛盾:

出于这些运算符的目的,指向不是数组元素的对象的指针与指向长度为 1 且对象类型作为其元素类型的数组的第一个元素的指针的行为相同。

意思是因为struct inotify_event *first_event它永远不是数组的元素,N2346/6.7.2.1p3所以它可以被认为是长度为一的数组的元素,矛盾N2346/6.7.2.1p3

0 投票
0 回答
123 浏览

arrays - 如何在 C 中获取包含 const 数组的 const 结构的正确大小

我得到一个包含 const char 数组的结构的错误大小。

示例(Arduino 代码):

串行窗口中打印的值:

问题是 my_struct 的大小错误(预期为 1+11=12),这样 my_struct2 将被初始化为错误的值。

我究竟做错了什么?

如何获得my_struct要用于的正确尺寸值my_struct2

编辑

只想提一下,my_struct在闪存中正确分配。

0 投票
1 回答
52 浏览

c - 为什么在 cfg80211 扫描请求中为具有灵活数组成员的结构分配了更多的内存(比所需的内存)?

我正在学习 linux wifi 驱动程序,并且正在探索子系统中的代码以cfg80211获取扫描请求。

我不明白为什么以下struct分配的内存比需要的多。或者,我无法理解以这种方式计算要分配的内存大小的方式。

struct定义在include/net/cfg80211.h

在 file/net/wireless/nl80211.c中,内存被分配给struct如下:

我怀疑分配的内存比需要的多。或者,计算大小的方式kzalloc对我来说没有意义。

这就是我期望的代码:

那为什么要分配这么大的内存呢?我的理解是kzalloc(struct + flexible_array_member + extra_len_but_why)

0 投票
2 回答
244 浏览

c++ - 具有多态性的类中的灵活数组成员

在 C99 中你可以有类似的东西

然后分配 withfoo* f=(foo*)malloc(sizeof(foo)+n)以获得数组长度为 的结构n

当类是具有虚函数的子类时,可以在 C++ 中做类似的事情吗?

就像foo是 bar 的子类,然后做类似的事情std::unique_ptr<bar> f= std::unique_ptr<foo>((foo*)malloc(sizeof(foo)+n))

我知道该代码不起作用,因为可以释放内存,delete但分配已经完成malloc

0 投票
0 回答
46 浏览

c - 为什么我不需要为静态结构内的灵活数组成员分配内存?

鉴于此代码:

输出 :

我不明白灵活数组如何处理内存。此外,根据包含 FAM 的结构的声明方式(静态与堆栈),行为似乎有所不同。