131得票5回答
零元素的数组有什么必要性?

在Linux内核代码中,我发现了以下我无法理解的东西。 struct bts_action { u16 type; u16 size; u8 data[0]; } __attribute__ ((packed)); 代码在这里:h...

86得票7回答
在C语言中使用可变长数组成员是不好的做法吗?

最近我读到使用C语言中的“柔性数组成员”是不良的软件工程实践。然而,这个说法没有任何论据支持。这是一个被广泛接受的事实吗? (柔性数组成员 是C99引入的一个C特性,可以声明最后一个元素为未指定大小的数组。例如:)struct header { size_t len; uns...

62得票10回答
在C++中,可变长数组成员是否有效?

在C99中,您可以这样声明一个结构体的柔性数组成员:struct blah { int foo[]; }; 然而,当我们在工作中有人尝试使用clang编译C++代码时,那个语法就不能用了。(使用MSVC时可以)我们不得不将其转换为:struct blah { int foo[0...

57得票5回答
零长度数组

我正在重构一些旧代码,发现其中有一些包含零长度数组的结构体(如下所示)。当然,可以通过#pragma指令抑制警告,但我尝试创建包含这种结构的“新”结构却失败了(错误2233)。数组'byData'被用作指针,为什么不使用指针呢?或者长度为1的数组?当然,在过程中没有添加任何注释让我感到困扰.....

43得票4回答
C语言中sizeof的内部机制是什么?

我在C语言中使用sizeof来获取结构体的大小,但是得到的结果出乎意料。struct sdshdr { int len; int free; char buf[]; }; int main(){ printf("struct len:%d\n",(sizeo...

36得票3回答
如何初始化具有可变数组成员的结构体

我有以下结构typedef struct _person { int age; char sex; char name[]; }person; 我在互联网上进行了一些基本搜索(但没有成功),关于如何创建一个含有可变数组成员的结构体实例并初始化它,而不使用malloc()...

34得票3回答
灵活数组成员可能导致未定义的行为?

在结构体类型中使用可变数组成员(Flexible Array Members,FAMs),是否会使我们的程序面临未定义的行为? 一个程序是否可以使用FAMs并仍然是一个严格符合规范的程序? 可变数组成员的偏移量是否必须在结构体的末尾? 这些问题适用于C99(TC3)和C11(TC1)。#...

25得票1回答
为什么灵活数组成员的静态初始化会起作用?

我已经编写了以下用于菜单的基本代码:typedef struct Menu { char* title; unsigned num_submenus; struct Menu *submenu[]; } Menu; Menu sub1 = {"Submenu 1", ...

24得票2回答
我能否通过为封闭结构分配更多空间来“过度扩展”数组?

坦白地说,这段代码是否有效或者会产生未定义行为?#include <stdio.h> #include <stdlib.h> #include <string.h> struct __attribute__((__packed__)) weird_stru...

24得票6回答
C++中的“结构体hack”等效方法

众所周知,在C90和C99中,有一种叫做结构体hack的技巧,可以在结构体的最后一个成员处使用长度为0的数组。随着C99引入灵活数组成员的方式,我们甚至可以使用[]以标准的方式来使用它。不幸的是,C++并没有提供这样的构造方法,并且(至少在Clang 3.4中),使用[0]或[]编译结构体将会...