1

我不明白如何为另一个结构中的结构数组动态分配内存。如在,这是我的问题......我有一个包含主要的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;
...
...

我的 project.c 文件中也有这个,它为多边形数组动态分配内存。

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

我在这里有两个问题,我应该何时以及如何为术语数组动态分配内存?我在想也许做一个指向一个指针的指针,该指针持有一个空的术语数组的 calloc 内存。这将在程序开始时完成,但在多项式分配之后(我认为)。

另一个问题,现在当我去释放内存时,应该在程序结束之前在它退出之前完成,并且我释放的顺序应该是自下而上,对吗?换句话说,先释放术语数组,然后释放多项式数组。

在这一点上,任何提示或指导都会有所帮助。谢谢!

4

3 回答 3

2

你可以简单地分配它

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

您不能直接在 struct 声明中执行此操作,因此您要执行的操作类似于

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

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

是的,您必须自下而上释放内存,首先释放所有术语,然后释放POLYNOMIALS.

于 2012-04-05T22:19:18.857 回答
1

首先,您的polynomial结构应如下所示:

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

然后对于您拥有的每个polynomial结构:

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

terms在释放结构之前,您需要释放指向的内存polynomial,否则您将无法访问该terms成员。

于 2012-04-05T22:21:19.523 回答
0

由于您的问题已标记为作业,因此我不会确切地告诉您。

TERM terms[20]是一个文字就地数组。如果您在函数中声明这样的变量,它将在堆栈上为该数量的数组元素保留确切的空间。如果您在结构内部进行,则会在结构本身内部留下空间。因此,您被要求将某些内容从X x[n]等效指针语法更改为也用于数组语法。

您已经写过POLYNOMIAL * polynomials,所以您知道这既是 (a) 指向单个多项式的指针,或者 (b) 指向多项式数组的指针,而且您可以使用malloc表达式对其进行初始化。

如果您使用从问题中已经知道的内容,那么您肯定可以看到自己被要求直觉的内容;您可以重写该字段term,使其指向一个或多个TERM结构。

于 2012-04-05T22:20:12.583 回答