Как да разпределя двумерни масиви с фиксиран размер в структура?

Имам структура, която изглежда така:

typedef struct _my_struct {
    float first_vector[SOME_NUM][OTHER_NUM];
    float second_vector[SOME_NUM][OTHER_NUM];
    int some_val;
} my_struct;

Бих искал да направя:

my_struct * thing = (my_struct *)malloc(sizeof(my_struct));

Но когато го направя и след това се опитам да получа достъп до нещо във векторите, получавам seg fault.

Ако вместо това декларирам векторите в структурата като:

typedef struct _my_struct {
    float **first_vector;
    float **second_vector;
    int some_val;
} my_struct;

и след това разпределете с:

my_struct->first_vector = (float**)malloc(sizeof(float*) * SOME_NUM);
my_struct->second_vector = (float**)malloc(sizeof(float*) * SOME_NUM);
int i;
for (i = 0; i < SOME_NUM; i++){ 
    my_struct->first_vector[i] = (float*)malloc(sizeof(float) * OTHER_NUM);
    my_struct->second_vector[i] = (float*)malloc(sizeof(float) * OTHER_NUM);
} 

След това всичко работи добре.

Тъй като първият и вторият вектор са с фиксиран размер и са известни по време на компилиране, изглежда странно, че трябва индивидуално да разпределям памет за тях. Има ли начин да ги декларирам в структурата, така че да мога просто да локализирам нова структура, без също така да разпределям памет за всеки вектор поотделно?


person Sam Judd    schedule 22.03.2012    source източник
comment
Правописна грешка ли е вторият кодов фрагмент? mystruct * struct няма смисъл.   -  person Collin    schedule 23.03.2012
comment
не, просто беше наистина неясно (структурата трябваше да бъде името на променливата...) Актуализирах.   -  person Sam Judd    schedule 23.03.2012
comment
Поправихте една от правописните грешки, но sizeof my_struct трябва до sizeof(my_struct).   -  person Brian McFarland    schedule 23.03.2012


Отговори (1)


Това, което имате, трябва да е наред.. освен фънкия typedef в горната част и странната декларация на my_struct * struct = malloc..., този малък тестов случай работи за мен:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    float first[10][20];
    float second[10][20];
    int val;
} my_struct;

int main(void) {
    printf("Sizeof mystruct %d\n", sizeof(my_struct));

    my_struct* str = malloc(sizeof(my_struct));
    if(!str) {
        printf("Memory allocation error!");
        exit(1);
    }

    str->first[0][0] = 1;
    str->second[1][19] = 15;

    printf("values %f %f\n", str->first[0][0], str->second[1][19]);

    free(str);

    return 0;

}

Изходът е:

Sizeof mystruct 1604
values 1.000000 15.000000

Освен това не трябва да прехвърляте върнатата стойност на malloc. Може да скрие важни предупреждения на компилатора.

person Collin    schedule 22.03.2012
comment
Трябва да проверите дали str не е NULL преди дерефериране (това би било възможен източник на грешка на OP) - person M.M; 01.05.2015