具有指针字段的结构的连续内存分配

时间:2016-10-17 22:21:15

标签: c malloc dynamic-memory-allocation

我有像

这样的结构

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需要保持不变

2 个答案:

答案 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 );