为什么动态分配(链表/树),c

时间:2010-02-18 20:25:36

标签: c malloc

我很困惑为什么你使用动态分配和为数据分配足够内存的概念。所以我们在课堂上介绍了链接列表,并且有以下代码:

NODE *BuildTree(NODE *p, const char *str)
{
    if (p == NULL)
    size_t length = strlen(str) + 1;
    p = (NODE *)malloc(sizeof(NODE));
    p->string = (char *)malloc(length);
    ....
}

typdef struct Node NODE;
struct NODE
{
    char *string;
    size_t count;
    NODE *left, *right;
};

代码应该创建一个包含从用户输入的字符串的树。我假设您动态分配NODE,因为您显然不知道您将需要多少个孩子。但是,为什么你需要为要输入的字符串str分配大小?或者这样做是因为结构的定义方式,你想要分配精确的amt,如果struct表示size_t count [50],并且只是浪费了内存。这是个主意吗?谢谢!

4 个答案:

答案 0 :(得分:5)

分配字符串是因为它们使用的是char *,字符数取决于字符串中的内容。

如果您的教授char blah[50];,您可以为50个字符提供足够的内存。因此,我认为他希望允许某人输入更多的静态字符数。

注意你教授的代码:

size_t length = strlen(str) + 1;
p = (NODE *)malloc(sizeof(NODE));
p->string = (char *)malloc(length);

strlen给出字符串的长度,并为终止字符添加一个字符串。现在长度可以设置为整个字符串的大小,即您的教授现在可以为字符串的大小分配足够的字符字节,在这种情况下(长度)。

答案 1 :(得分:3)

您正在动态分配字符串,因为您在编译时不知道字符串的大小。您正在动态分配节点,因为您不知道编译时需要多少个节点。

基本上,只要您不知道对象在编译时将使用多少内存,就需要动态分配。我认为可以将字符串粘贴在节点结构的末尾,并在一个动态分配中执行整个操作(以便整个节点是一个连续的数据块)。

答案 2 :(得分:1)

您需要分配字符串的大小,因为实际数据在创建时存储在节点中。节点的子节点只是指向其他节点的指针,只占用每个节点内指针的大小

答案 3 :(得分:0)

您的理解是正确的。如果用户输入的字符串长度未知,则最多预先指定大小是很困难的。如果已知最大大小,则可以将其声明为char string[N];。但是,正如你所说,如果尺寸变化很大,那会浪费记忆力。另一方面,创建预定义大小的好处是它可以减少分配,这有时是有益的。