我不明白如何为另一个结构中的结构数组动态分配内存。就像,这是我的问题...我有一个包含main的project.c文件,我有另一个polynomial.c文件,它处理所有poly运算,如添加项,将多项式乘以数字等。
这是多项式的头文件.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文件中也有这个,该文件为poly数组动态分配内存。
POLYNOMIAL *polynomials = (POLYNOMIAL *)malloc(sizeof(POLYNOMIAL) * 8);
// 8 being the max number of polynomials I wan to store
我在这里有两个问题,何时以及如何动态分配术语数组的内存?我在想也许做一个指向一个指针的指针,该指针保存一个空术语数组的 calloc 内存。这将在程序开始时完成,但在多项式分配之后(我认为)。
另一个问题,现在当我去释放内存时,这应该在程序退出之前在程序结束时完成,并且我释放的顺序应该是自下而上的,对吧?换句话说,释放项数组,然后释放多项式数组。
在这一点上,任何提示或指导都会有所帮助。谢谢!
您可以简单地分配它
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
数组.
首先,您的polynomial
结构应如下所示:
typedef struct polynomial {
int size;
TERM *terms;
} POLYNOMIAL;
然后,对于您拥有的每个polynomial
结构:
p.terms = calloc(size, sizeof(*terms));
在释放polynomial
结构之前,您需要释放 terms
指向的内存,否则您将无法访问 terms
成员。
由于您的问题被标记为家庭作业,因此我不会确切地告诉您。
TERM terms[20]
是一个文本就地数组。如果您在函数中声明了类似的变量,它将在堆栈上为该数量的数组元素保留确切的空间。如果你在结构内这样做,它会在结构本身内留下空间。 因此,系统要求您将某些内容从 X x[n]
更改为等效的指针语法,该语法也用于数组语法。
您已经编写了POLYNOMIAL * polynomials
,因此您知道这既是 (a) 指向单个多项式的指针,要么是 (b) 指向多项式数组的指针,并且您可以使用 malloc
表达式对其进行初始化。
如果你使用你从问题中已经知道的东西,你肯定可以看到你被要求自己直觉的东西; 您可以重写字段term
,使其可以指向一个或多个TERM
结构。