我有像
这样的结构 struct mystruct {
int x;
int size_of_data;
int *data;
}
我想在连续内存区域为mystruct和数据分配内存。
我试过malloc(sizeof(struct mystruct)+size_of_data*sizeof(int))
,但我遇到了分段错误。
我也尝试过:
struct mystruct *var = malloc(sizeof(*var))
var->data = malloc(size_of_data*sizeof(int))
但问题是分配器不能保证var->data
将与整个结构一致,但我强烈需要连续。有什么想法吗?
mystruct
需要保持不变
答案 0 :(得分:2)
您的分配正确,但您必须初始化data
成员以指向int
。
struct mystruct *s;
s = malloc(sizeof(struct mystruct)+size_of_data*sizeof(int));
assert(s);
s->data = (int *)(s+1);
/* now can use data member like an array */
或者,您可以修改mystruct
的定义,使data
成为一个灵活的数组。然后,data
将位于您为其分配空间的int
的开头。
struct mystruct {
int x;
int size_of_data;
int data[];
};
struct mystruct *s;
s = malloc(sizeof(struct mystruct)+size_of_data*sizeof(int));
assert(s);
/* now can use data member like an array */
答案 1 :(得分:2)
你想要的是一个"灵活的阵列成员"。 Per 6.7.2.1结构和联合说明符,the C Standard的第18段:
作为一种特殊情况,结构的最后一个元素有多个 命名成员可能具有不完整的数组类型;这叫做a 灵活的阵列成员。在大多数情况下,灵活的阵列 成员被忽略。特别是结构的大小 好像灵活的阵列成员被省略了除外 它可能有更多的尾随填充,而不是遗漏意味着。 但是,当一个。 (要么 - > )运算符有一个左操作数,它是一个带有灵活数组成员和右操作数的结构(指向) 命名该成员,其行为就好像该成员被替换为 不能制作的最长的数组(具有相同的元素类型) 结构大于被访问的对象;的偏移量 数组应保持灵活数组成员的数组,即使这样 将与替换阵列的不同。如果这个数组会 没有元素,它表现得好像它有一个元素但是 如果尝试访问该行为,则行为未定义 元素或生成一个经过它的指针。
示例:
typedef struct flexible
{
size_t len;
char data[];
} flexible_t;
...
size_t thisMuchData = getAmountOfData();
flexible_t *ptr = malloc( sizeof( *ptr ) + thisMuchData );
ptr->len = thisMuchData;
memcpy( ptr->data, dataSource, thisMuchData );