如何在结构中分配固定大小的二维数组?

时间:2012-03-22 19:59:42

标签: c arrays multidimensional-array malloc

我有一个看起来像这样的结构:

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错误。

如果我改为将结构中的向量声明为:

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

然后一切正常。

由于第一个和第二个向量的大小是固定的并且在编译时是已知的,因此我必须为它们单独分配内存似乎很奇怪。有没有办法在结构中声明它们,这样我就可以在不分别为每个向量分配内存的情况下malloc一个新的结构?

1 个答案:

答案 0 :(得分:3)

你所拥有的应该没问题......除了my_struct * struct = malloc...顶部的奇怪的typedef和#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

输出是:

{{1}}

此外,您不应该转换malloc的返回值。它可以隐藏重要的编译器警告。