2012-04-05 170 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成员。