Как рассчитать объем памяти, необходимый для структуры с переменной длиной?

учитывая структуру, такую как эта:

struct a {
    int b;
    int c;
    my_t d[];
}

что я должен передать malloc выделить достаточно памяти для struct a здесь d и n элементов?

3 ответов


struct a *var = malloc(sizeof(*var) + n*sizeof(var->d[0]))

использование переменных для sizeof обеспечит размер обновляется, если меняются. В противном случае, если вы измените тип d или var вы рискуете ввести тихие и потенциально труднодоступные проблемы во время выполнения, не выделяя достаточно памяти, если вы забудете обновить какие-либо соответствующие выделения.


вы можете использовать, например:sizeof(struct a) + sizeof(my_t [n]).

typedef int my_t;

struct a {
  int b;
  int c;
  my_t d[];
};

int n = 3;

main(){
  printf("%zu %zu\n", sizeof(struct a), sizeof(my_t [n]));
}

результат: 8 12


этого должно быть достаточно:

sizeof(a) + n * sizeof(my_t)