我正在写一个程序,需要创建一个可变数量的链表以下内容在程序开始时全局声明:
struct Node
{
int Line;
struct Node *Next;
} ;
struct Node* Heads[5];
struct Node* Currs[5];
int NumOfNames;
main()
中的第一个函数将计算并存储NumOfNames
的值然后我需要将Heads[5]
和Currs[5]
的大小更改为Heads[NumOfNames]
和Currs[NumOfNames]
,以便创建NumOfNames
数量的链接列表。沿着这条线能做些什么吗?我对编程还很陌生,对
malloc
和realloc
的了解也很差,但我想我需要使用这些函数来实现我的目标。谢谢你事先的建议。
最佳答案
这里有static allocation并且内存是在堆栈上分配的(实际上不是在堆栈上,因为这些是全局变量-请参阅注释)这意味着需要在编译时知道数组的大小另一方面,您希望能够在运行时分配内存,因为您之前不知道大小(NumOfNames
)这称为dynamic allocation,您需要malloc
(或calloc
,…)来实现这样的内存是在堆上分配的如需了解更多信息,请阅读以下内容:
Difference between static memory allocation and dynamic memory allocation
What and where are the stack and heap?
要使用malloc
执行所需操作,可以执行以下操作:
struct Node
{
int Line;
struct Node *Next;
} ;
struct Node** Heads;
struct Node** Currs;
int NumOfNames;
int main() {
// ...
NumOfNames = 42;
Heads = malloc(NumOfNames * sizeof(struct Node*));
Currs = malloc(NumOfNames * sizeof(struct Node*));
// if you want to allocate the Nodes too...
int i;
for (i = 0; i < NumOfNames; i++) {
Heads[i] = malloc(sizeof(struct Node));
Currs[i] = malloc(sizeof(struct Node));
}
// ...
}
当您动态分配内存(使用
malloc
,calloc
,realloc
,…)时,请确保当您不再需要它时也free()它。