我有以下具有灵活数组成员的结构:
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
这样做的遵循方式是什么?
根据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] 删除。
我来说两句