2012-04-05 151 views
0

我不明白如何爲另一個結構內的結構數組動態分配內存。如在這裏是我的問題...我有一個project.c文件,其中包含主,我有另一個polynomial.c文件,處理所有的聚合操作,如添加條款,乘以數字等多項式..動態內存分配結構中的數組,

這是polynomials.h

typedef struct term{ 
    int coeff; 
    int expo; 
} TERM; 

typedef struct polynomial { 

int size; 
// This needs to be changed to calloc.. not sure how within a struct 
TERM terms[20]; 

} POLYNOMIAL; 
... 
... 

I,其用於動態聚陣列分配內存我project.c文件內也有這樣的頭文件。

POLYNOMIAL *polynomials = (POLYNOMIAL *)malloc(sizeof(POLYNOMIAL) * 8); 
// 8 being the max number of polynomials I wan to store 

我在這裏有兩個問題,何時以及如何動態地爲術語數組分配內存?我在想也許要做一個指針,該指針持有一個空的數組項的calloc內存。這將在程序開始時完成,但在多項式分配之後(我認爲)。

另一個問題,現在當我釋放內存時,應該在程序結束前完成,然後退出,我釋放的順序應該是自下而上的,對嗎?換句話說,釋放術語數組然後釋放多項式數組。

在這一點上任何提示或指導將有所幫助。謝謝!

回答

1

你可以簡單地用

TERM *terms = calloc(20, sizeof(TERM)); 

分配它不能直接在結構聲明做,所以你要做的是一樣的東西

POLYNOMIAL *polynomials = calloc(size, sizeof(POLYNOMIAL)); 

for (int i = 0; i < size; ++i) 
    polynomials[i].terms = calloc(20, sizeof(TERM)); 

是的,你會必須自由記憶下來,首先你可以釋放所有的條件,然後你可以釋放數組POLYNOMIALS

+3

這符合他爲他做功課的資格。難道不是爲了解決這個問題而不是更好,而是讓他不用爲他做出解決方案? – 2012-04-05 22:20:52

+0

什麼時候應該調用*條件calloc? – Hall9 2012-04-05 22:21:19

+0

最重要的是你正在使用的多項式指向有效的指針,否則你不能分配它們的成員。 – Jack 2012-04-05 22:22:05

0

由於您的問題標記爲家庭作業,我不會完全告訴你。

TERM terms[20]是一個字面就地數組。如果你在一個函數中聲明瞭一個類似變量的變量,它將在堆棧中爲這個數組元素保留精確​​的空間。如果你在一個結構裏面做了它,它會在結構本身留下空間。所以你已經被要求將X x[n]中的某些東西改爲等價的指針語法,它也用於數組語法。

您已經寫入了POLYNOMIAL * polynomials,因此您知道這是(a)指向單個多項式的指針,或者(b)指向多項式數組的指針,並且您可以使用malloc表達式對其初始化。

如果你使用你已經知道的問題,你當然可以看到你被問到了什麼,你可以重寫字段term,以便它可以指向一個或多個TERM結構。

0

對於啓動polynomial結構應該是這樣的:

typedef struct polynomial { 
    int size; 
    TERM *terms; 
} POLYNOMIAL; 

然後對於每個polynomial結構您有:

p.terms = calloc(size, sizeof(*terms)); 

你需要釋放內存指向terms之前您免費polynomial結構,因爲否則您將不被允許訪問terms成員。