如何均匀地分配具有灵活数组成员的结构体数组?

一些名字

我有以下具有灵活数组成员的结构:

struct test {
    size_t sz;
    const char str[];
};

现在,我想分配一些内存以连续放置此结构(例如在数组中)。问题是像struct test test_arr[]未定义行为一样的声明6.7.2.1(p3)

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

我们知道,返回的指针malloc可以转换为具有基本对齐方式的任何对象类型的指针。考虑以下代码:

void *obj= malloc(100 * sizeof(struct test)); //enough memory
struct test *t1 = obj;
t1 -> sz = 2;
t1 -> str = {'a', 'b'};
struct test *t2 = (void *) (((char *) obj) + sizeof(struct test) + sizeof(char[2])); // non conforming 

这样做的遵循方式是什么?

dbush

根据struct您提供的报价,具有灵活数组成员的不能是数组的成员。

解决此问题的最佳方法是将灵活数组成员更改为指针,并为其单独分配空间。

struct test {
    size_t sz;
    char *str;
};

...

struct test *arr = malloc(100 * sizeof(struct test));

arr[0].sz = 2;
arr[0].str = malloc(2);
arr[0].str[0] = 'a';
arr[0].str[1] = 'b';

arr[1].sz = 3;
arr[1].str = malloc(3);
arr[1].str[0] = 'c';
arr[1].str[1] = 'd';
arr[1].str[2] = 'e';

另外,拥有const结构的成员通常也不是一个好主意

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

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

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

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

C ++“替换”为具有灵活数组成员的结构

具有灵活数组成员的结构和具有指针成员的结构之间的区别

如何初始化具有 unint_t 作为灵活数组成员的结构?

从具有灵活数组成员的结构强制转换为没有该变量的其他结构是否是未定义的行为?

使用数组并在结构中分配内存(灵活的数组成员)

与具有柔性数组成员的匿名结构联合

具有数组成员的结构

返回具有数组成员的本地结构

具有弹性char数组成员的结构

什么是结构中的灵活数组成员?

未命名结构的灵活数组成员

嵌套结构中的灵活数组成员

GCC与Clang复制结构灵活数组成员

没有命名成员的GCC错误结构灵活数组成员

当我对结构进行浅拷贝时,灵活数组成员没有被复制

如何将内存分配给具有数组成员的类实例?

为什么使用灵活的数组成员进行的结构初始化无效但对于固定大小的数组成员却有效?

结构的数组成员不可分配

如何在C ++中删除由动态分配的数组成员组成的动态分配的结构?

sizeof()具有零长度数组成员的结构

可变长度数组和灵活数组成员之间有什么区别?

具有静态数组成员变量的迭代器

类具有带动态数组成员的类

联合会支持灵活的数组成员吗?