Segfault при доступе к динамически распределенному массиву C struct - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть следующая структура, которая определена следующим образом

typedef struct _abcd {
    int a;
    unsigned long b;  
    void (*c)(int);
    int d;
} abcd_t, *abcd;

Теперь у меня есть следующий код

static abcd foo

int set_size(int size){
   foo = malloc(sizeof(abcd) * size);
}

Этот код по какой-то причине дает мне segfault при доступе к некоторымсвойств членов массива.Но я заметил, что если я изменю строку malloc на следующую - это решит проблему

foo = malloc(sizeof(foo[0]) * size);

Я нахожу это странным, как очевидно sizeof(foo[0]) = sizeof(abcd) Так в чем же здесь разница?

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Ошибка в том, что вы выделяете sizeof(abcd), и это указатель, а не структура. Вы хотите sizeof(abcd_t) или sizeof(*abcd).

0 голосов
/ 15 ноября 2018

очевидно sizeof(foo[0]) = sizeof(abcd)

Это не то же самое, поскольку вы typedef ed abcd являетесь * указателем * на struct _abcd.

Используйте

foo = malloc(sizeof(*foo) * size);

, чтобы получить надежный код, даже если в какой-то момент тип foo должен измениться.

Ваш

foo = malloc(sizeof(foo[0]) * size);

по сути то же самое, поскольку foo[0] является просто синтаксическим сахаром для *(foo + 0), который становится *foo.

...