2014-08-27 88 views
1

我想分配內存的數組是我需要使用的結構的成員,在一個函數,將結構作爲參數。作爲參數傳遞的結構中的數組的malloc

arg->A.size=(int*) malloc(N*sizeof(int)); 

不會編譯(請求構件「尺寸」是東西不是結構。

arg->A->size=(int*) malloc(N*sizeof(int)); 

將拋出一個分段錯誤

任何幫助將受到讚賞。 這裏是代碼,謝謝:

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

// struct A 
struct A { 
    int dim;    // dimensions 
    int* size;    // points per dim array 
    double* val;   // values stored in array 
    int total;    // pow(size,dim) 
}; 

// struct B that uses A 
struct B { 
    int tag; 
    struct A* A; 
}; 

int function_AB(struct B* B); 

int main(void){ 
    struct B B; 
    function_AB(&B); 

    return 0; 
} 

int function_AB(struct B* arg){ 
    int N=10; 
    arg->tag=99; 
    printf("tag assigned = %d \n", arg->tag); 
    arg->A->size=(int*) malloc(N*sizeof(int)); 

    return 0; 
} 

回答

0

當你在另一個結構中有結構指針時,首先你需要爲它分配內存。然後爲結構成員分配內存!

struct B { 
    int tag; 
    struct A* A; 
}; 

這裏A是指向稱爲A的結構的指針。首先分配內存對於這一點,然後分配內存的struct A

arg->A = malloc(sizeof(struct A)); 

那麼元素做 -

arg->A->size = malloc(N*sizeof(int)); 

嘗試在你的int function_AB(struct B* arg)以下變化 -

int function_AB(struct B* arg){ 
int N=10; 
arg->tag=99; 
printf("tag assigned = %d \n", arg->tag); 

arg->A = malloc(sizeof(struct A)); // First allocate the memory for struct A* A; 

arg->A->size = malloc(N*sizeof(int)); // Allocate the memory for struct A members 
arg->A->val = malloc(N*sizeof(double)); 

// do your stuff 

// free the allocated memories here 
free(arg->A->size); 
free(arg->A->val); 
free(arg->A); 

return 0; 
} 

也不要投下malloc()的結果!

+0

到目前爲止,我認爲Sathish是正確的(擴展已由downhillFromHere第一個答案建議的變化)。在函數內部實現它正是我正在尋找的,所以我特別使用arg-> A = malloc(sizeof(struct A))指令,而不管前/後賦值如何。我仍然會使用malloc int和double casting來設置size和val。有什麼理由避免這樣做?我仍然需要弄清楚在函數返回之前是否必須使用free,size和val。如果出現問題,我會更新。非常感謝你。 – mae 2014-08-27 15:02:16

+0

@mae在c'malloc'中將分配內存並將適當的指針返回給分配的內存!如果你發現這個答案是有幫助的,不要忘記驗證它! – Sathish 2014-08-27 15:07:42

+0

你說得對。由於從實際需要的C++遷移而導致的錯誤做法。 – mae 2014-08-28 07:41:03

1

你根本沒有分配內存struct A *A。到A->size分配任何東西之前,你首先需要做的是這樣

B->A = malloc(sizeof(struct A)); 
1

第二種情況是正確的,但崩潰,因爲B內聲明的主尚未分配的值。你可能想要類似於

struct A A; 
struct B B; 
B.A = &A; 

function_AB(&B);