结构中数组的动态内存分配,

时间:2012-04-05 22:16:11

标签: c struct dynamic-memory-allocation array-initialization

我不明白如何为另一个结构中的结构数组动态分配内存。就像在,这是我的问题...我有一个包含main的project.c文件,我有另一个polynomial.c文件,它处理所有的poly操作,比如添加术语,将多项式乘以数字等等。

这是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文件中有这个,它为poly数组动态分配内存。

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

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

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

此时任何提示或指导都会有所帮助。谢谢!

3 个答案:

答案 0 :(得分:1)

您只需使用

分配即可
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数组。

答案 1 :(得分:0)

由于您的问题被标记为家庭作业,我不会完全告诉您。

TERM terms[20]是一个文字就地数组。如果在函数中声明了类似的变量,它将在堆栈上为该数量的数组元素保留确切的空间。如果你在一个结构中做到了它,它将在结构本身内留出空间。因此,您被要求将X x[n]中的内容更改为等效指针语法,该语法也用于数组语法。

您已经编写了POLYNOMIAL * polynomials,因此您知道这是(a)指向单个多项式的指针,或者(b)指向多项式数组的指针,并且您可以使用{来初始化它{1}}表达。

如果你使用你在问题中已经知道的东西,肯定你可以看到你被要求自己想要的东西;您可以以可以指向一个或多个malloc结构的方式重写字段term

答案 2 :(得分:0)

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

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

然后对于每个polynomial结构:

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

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