2012-03-22 44 views
3

我有一個結構,看起來像這樣:如何在結構中分配固定大小的二維數組?

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一個新的結構,而不需要分別爲每個向量分配內存?

+0

第二個代碼段是否是錯字? 'mystruct * struct'沒有意義。 – Collin 2012-03-22 20:02:09

+0

不,它只是真的不清楚(struct應該是變量的名字......)我已經更新了。 – 2012-03-22 20:45:48

+0

您修正了其中一個拼寫錯誤,但'sizeof my_struct'應該由'sizeof(my_struct)'。 – 2012-03-22 20:50:48

回答

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 

另外,你不應該使用malloc的返回值。它可以隱藏重要的編譯器警告。

+0

在解除引用之前,你應該檢查'str'是不是'NULL'(這將是OP的段錯誤的可能來源) – 2015-05-01 20:42:35