Tag: flexible array member

如何通过值发送数组到c中的函数?

我试过类似的东西: typedef struct vec{ int sz; int v[]; } ff; int sum(struct vec z){ int o=0,i; for(i=0;i<z.sz;i++) o+=zv[i]; return o; } int main(){ int test[]={10,1,2,3,4,5,6,7,8,9,10}; return sum((struct vec)test); } 但是这个示例代码无法编译。 如何通过值(不是ref throw指针)发送数组来运行?

具有灵活数组成员的结构数组如何表现?

正如标题所述,我想知道具有灵活数组成员的C结构数组如何表现。 这是一个例子: struct vector { size_t length; double array[]; }; 维基百科的文章说: 这种结构上的sizeof运算符需要给出灵活数组成员的偏移量。 在我的机器上,这对应于8个字节( sizeof(size_t) )。 但是,当我执行以下操作时会发生什么: 显然,数组不能保存向量v0的数据,因为它只有3 * 8字节= 24字节宽。 我该如何处理这样的情况? #define LENGTH 10 int main() { struct vector arr[3]; struct vector *v0 = calloc(1, sizeof(*v0) + LENGTH * sizeof(v0->array[0])); v0->length = LENGTH; size_t i; for (i = 0; i length; i++) { v0->array[i] = […]

具有灵活数组成员的结构的大小

特定 struct Foo { uint32_t a; uint32_t b[]; }; 什么是sizeof(Foo) ? 是实现定义还是未定义的行为? 对C和C ++的答案有何不同?

通过在作为另一个结构的一个结构而不是第一个成员的结构之间转换指针来实现C中的inheritance是否合法?

现在我知道我可以通过将指向struct的指针强制转换为该struct的第一个成员的类型来实现inheritance。 然而,纯粹作为一种学习经验,我开始想知道是否有可能以稍微不同的方式实现inheritance。 这段代码合法吗? #include #include struct base { double some; char space_for_subclasses[]; }; struct derived { double some; int value; }; int main(void) { struct base *b = malloc(sizeof(struct derived)); b->some = 123.456; struct derived *d = (struct derived*)(b); d->value = 4; struct base *bb = (struct base*)(d); printf(“%f\t%f\t%d\n”, d->some, bb->some, d->value); return 0; } […]

灵活arrays成员的真正好处是什么?

在阅读了一些与柔性arrays成员相关的post后,我仍然不完全理解为什么我们需要这样的function。 可能重复: C中的灵活arrays成员 – 糟糕吗? 这是C中的Flexible Array Struct成员吗? (如果我没有从上面可能的重复问题中解决我的问题,请怪我) 以下两个实现之间的真正区别是什么: struct h1 { size_t len; unsigned char *data; }; struct h2 { size_t len; unsigned char data[]; }; 我知道h2的大小就好像省略了灵活的数组成员(数据),即sizeof(h2) == sizeof(size_t) 。 而且我也知道灵活的数组成员只能作为结构的最后一个元素出现,因此原始实现在data位置可以更灵活。 我真正的问题是为什么C99添加此function? 仅仅因为sizeof(h2)不包含实际大小的数据? 我相信我必须错过这个function的一些更重要的观点。 请指出给我。

灵活的arrays成员(零长度arrays)

参考GCC的零长度arrays说明: 当struct是可变长度对象的头时,这尤其有用。 这正是我的情况。 此外,我关心的是我的结构在堆中的对齐。 在这种情况下,我仍然不明白零长度数组有什么用处。 它们与这种特殊情况有什么关系? 编辑: 我可以在那里放置尽可能多的“数据”吗?

灵活的arrays成员真的有必要吗?

显然,具有灵活数组成员的结构不是要声明的,而是与指向该结构的指针一起使用。 声明灵活数组成员时,必须至少有一个其他成员,并且灵活数组成员必须是该结构中的最后一个成员。 假设我有一个看起来像这样的: struct example{ int n; int flm[]; } 然后要使用它,我将必须声明一个指针并使用malloc为结构的内容保留内存。 struct example *ptr = malloc(sizeof(struct example) + 5*sizeof(int)); 也就是说,如果我希望我的flm []数组保持五个整数。 然后,我可以像这样使用我的结构: ptr->flm[0] = 1; 我的问题是,我不应该只使用指针而不是这个吗? 它不仅在C99之前兼容,而且可以在有或没有指向该结构的指针的情况下使用它。 考虑到我已经必须将malloc与flm一起使用,我不应该只能这样做吗? 考虑这个示例结构的新定义; struct example{ int n; int *notflm; } struct example test = {4, malloc(sizeof(int) * 5)}; 我甚至能够以与柔性arrays成员相同的方式使用替换: 这还行吗? (以非flm为例提供上述示例) struct example test; test.n = 4; notflm = […]

使用灵活的数组成员分配struct

这是C99代码: typedef struct expr_t { int n_children; foo data; // Maybe whatever type with unknown alignment struct expr_t *children[]; } expr_t; 现在,我该如何分配内存? expr_t *e = malloc (sizeof (expr_t) + n * sizeof (expr_t *)); 要么 expr_t *e = malloc (offsetof (expr_t, children) + n * sizeof (expr_t *)); ? sizeof甚至可以保证在具有灵活arrays成员的类型上工作(GCC接受它)吗?

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

我有以下结构 typedef struct _person { int age; char sex; char name[]; }person; 关于如何创建实例并使用灵活的数组成员初始化结构而不使用malloc()我已经完成了一些基本的互联网搜索(但不成功malloc() 。 例如:对于普通结构,如 struct a { int age; int sex; }; 我们可以创建一个struct a的实例并将其初始化为 struct a p1 = {10, ‘m’}; 但是对于具有灵活数组的结构(如_person提到的_person ),我们如何创建一个实例并初始化,就像我们如何为普通structures做的那样? 它甚至可能吗? 如果是这样,我们如何在初始化期间传递数组大小以及要初始化的实际值? (要么) 是否真的是使用灵活数组创建结构的唯一方法是使用C99规范中提到的malloc() – 6.7.2.1 Structure and union specifiers – point #17 ?

结构中的Unsized数组声明

为什么C允许这样: typedef struct { int arr []; } s; 数组arr没有指定大小?