Как выделить двумерные массивы фиксированного размера в структуре? - PullRequest
3 голосов
/ 22 марта 2012

У меня есть структура, которая выглядит так:

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

Но когда я делаю это и затем пытаюсь получить доступ к чему-либо в векторах, я получаю ошибку сегмента.

Если я вместо этого объявлю векторы в структуре как:

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

Тогда все работает нормально.

Поскольку первый и второй вектор имеют фиксированный размер и известны во время компиляции, кажется странным, что мне приходится отдельно выделять для них память. Есть ли способ объявить их в структуре, чтобы я мог просто распределить новую структуру, не выделяя при этом память для каждого вектора отдельно?

1 Ответ

3 голосов
/ 23 марта 2012

То, что у вас должно быть в порядке ... кроме фанки 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. Может скрывать важные предупреждения компилятора.

...