【问题标题】:continuous memory allocation for structure with pointer fields具有指针字段的结构的连续内存分配
【发布时间】:2016-10-17 22:21:15
【问题描述】:

我有一个类似的结构

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

【问题讨论】:

  • malloc(sizeof(struct mystruct)+size_of_data*sizeof(int)) 应该可以工作。显示您的代码和错误
  • 您的第一次尝试是可行的,您一定在某个地方犯了错误。请发帖MCVE

标签: c malloc dynamic-memory-allocation


【解决方案1】:

您的分配正确,但您必须初始化您的 data 成员以指向 ints。

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 将位于您为其分配空间的 ints 的开头。

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 */

【讨论】:

  • @user3528438 不会,因为更强的对齐满足更弱的对齐要求。
  • @2501 他可能意味着较弱的对齐。对于这个特定的结构,这不会发生。
  • @user3528438 sizeof( struct ... ) 是否可以返回小于 struct 的对齐要求的值?如果是这样,那么事情就会变得有趣......
  • @AndrewHenle:C.2011 中的脚注 106。
【解决方案2】:

你想要的是一个“灵活的数组成员”。根据 6.7.2.1 结构和联合说明符,第 18 段,the C Standard

作为一种特殊情况,结构的最后一个元素具有多个 命名成员可能具有不完整的数组类型;这被称为 灵活的数组成员。在大多数情况下,柔性阵列 成员被忽略。特别是结构的大小 就像省略了灵活数组成员一样,除了 它可能有比省略所暗示的更多的尾随填充。 然而,当一个 . (或者 -> ) 运算符的左操作数是(指向)具有灵活数组成员和右操作数的结构 命名该成员,它的行为就像该成员被替换为 最长的数组(具有相同的元素类型)不会使 结构大于被访问的对象;的偏移量 数组应保持灵活数组成员的数组,即使这 将不同于替换阵列。如果这个数组 没有元素,它的行为就好像它只有一个元素,但是 如果尝试访问该行为,则行为未定义 元素或生成一个越过它的指针。

例子:

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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2017-01-03
    • 2013-08-17
    • 1970-01-01
    • 2021-02-10
    • 2019-10-20
    • 1970-01-01
    • 2019-09-23
    • 2021-12-12
    相关资源
    最近更新 更多