我正在写一个程序,需要创建一个可变数量的链表以下内容在程序开始时全局声明:

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数量的链接列表。沿着这条线能做些什么吗?
我对编程还很陌生,对mallocrealloc的了解也很差,但我想我需要使用这些函数来实现我的目标。
谢谢你事先的建议。

最佳答案

这里有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));
    }
    // ...
}

当您动态分配内存(使用malloccallocrealloc,…)时,请确保当您不再需要它时也free()它。

10-06 04:10