В вашем конкретном случае, ваша программа также сегментации даже если он составлен, однако, так как вы» повторно назначая данные *f
без его выделения.
Для вас есть несколько решений. Наиболее простым было бы, вероятно, просто выделить структуру function
в стеке, но для этого потребуется либо изменить его typedef
, либо не указывать указатель, либо напрямую использовать имя структуры. Я пойду с позже для этого примера:
struct function_struct fbuf = {
.members = {
[0] = {2.0, 1.0},
[1] = {1.0, 1.0}
},
.description = "x squared",
};
function f = &fbuf;
Еще бы инициализировать элементы один на один, вручную:
f = malloc(sizeof(*f)):
f->members[0].degree = 2.0;
f->members[0].coefficient = 1.0;
f->members[0].degree = 1.0;
f->members[0].coefficient = 1.0;
f->description = "x squared";
Третий может быть использовать соединение буквального:
f = &(struct function_struct) {
.members = {
[0] = {2.0, 1.0},
[1] = {1.0, 1.0},
},
.description = "apa",
};
Это последнее сделано почти так же, как и первое, только является анонимным.
Вы также можете объединить второй и третий, если вы хотите, чтобы память о структуры, которые будут выделены в куче, а не на стеке:
f = malloc(sizeof(*f)):
*f = (struct function_struct) {
.members = {
[0] = {2.0, 1.0},
[1] = {1.0, 1.0},
},
.description = "apa",
};
Что касается вашего «наилучшей практики» аспект, Я не думаю, что либо изначально лучше или хуже, чем любое другие, но они отличаются в некоторых аспектах:
- третьи и четвертые, используя составные литералы, требуют ПОСЛЕДНЕЙ версии C, так что если вы» чтобы быть совместимыми с древними компиляторами C, они это плохая идея. Однако это должно быть редким вопросом в наши дни.
- Первые и третьи выделяют данные в стеке, а второй и четвертый выделяют данные в куче. Это отличается, а не лучше или хуже, поэтому выбирайте то, что подходит вашему сценарию.
- В зависимости от компилятора, второй пример может быть быть быстрее, так как он не касается 98 членов, которые остались неиспользованными. Однако вы должны были бы инициализировать много структур
function
в очень узком цикле, чтобы это было проблемой. :)
Я подозреваю, что инициализация 'f-> членов. – Jeyaram
Что лучше всего подходит для этого очень субъективно. Лично я бы никогда не использовал назначенные инициализаторы для массивов, потому что ... это не имеет большого смысла для этого.Если у вас есть массив, в котором вам нужно рассматривать каждый член массива как особый случай по любой причине, вы должны добавлять комментарии к каждой строке. – Lundin