【问题标题】:Why dynamic allocation (linked lists/trees), c为什么动态分配(链表/树),c
【发布时间】:2010-02-18 20:25:36
【问题描述】:

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

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;
};

该代码应该使用用户输入的字符串创建一棵树。我假设您动态分配节点,因为您显然不知道需要多少个孩子。但是,为什么需要为要输入的字符串 str 分配大小?或者是因为结构的定义方式并且您想要分配确切的amt,而不是结构说size_t count [50],并且只是浪费了内存。是这个主意吗?谢谢!

【问题讨论】:

标签: c malloc


【解决方案1】:

分配字符串是因为它们使用 char* 并且字符数取决于放置在字符串中的内容。

如果你的教授做了char blah[50];,你会给它足够的内存来容纳 50 个字符。所以我假设他希望允许某人输入比静态数量更多的字符。

注意教授的代码:

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

strlen 给出一个字符串的长度,并在其上加一作为终止字符。现在可以将长度设置为整个字符串的大小,即您的教授现在可以为字符串的大小分配足够的字符字节,在本例中为(长度)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我曾经使用过的一个技巧(但我不是很自豪)是将一个 char 向量作为结构中的最后一个元素,给它一个零(或 1)大小,然后为使用 offsetof 宏加上字符串所需大小的结构和字符串。节省了 1 个内存分配,但确实会让人迷惑。我很惭愧。
        • @Patrick:很酷 - 我已经不止一次这样做了,所以如果它很糟糕,那么我就会成倍增加。
        猜你喜欢
        • 1970-01-01
        • 2016-05-22
        • 2013-07-18
        • 2016-12-12
        • 2011-08-16
        • 2016-08-30
        • 2021-02-12
        • 1970-01-01
        • 2019-06-18
        相关资源
        最近更新 更多