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

为什么动态分配(链表/树),c,c,malloc,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 str

我搞不懂为什么要使用动态分配和为数据分配足够内存的概念。我们在课堂上讨论了链表,下面是代码:

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的大小呢?或者这是因为结构的定义方式,您希望分配确切的金额,而不是如果结构说大小为[50],并且只是浪费了内存。是这样吗?谢谢

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


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

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


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

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

如果你的教授说了些废话;你会给它足够的内存来存储50个字符。所以我假设他想允许某人输入更多的字符,而不是静态数量的字符

请注意教授的代码:

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

strlen给出字符串的长度,并为终止字符添加一个长度。现在,长度可以设置为整个字符串的大小,也就是说,您的教授现在可以为字符串的大小分配足够的字符字节,在本例中为长度。

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

如果你的教授说了些废话;你会给它足够的内存来存储50个字符。所以我假设他想允许某人输入更多的字符,而不是静态数量的字符

请注意教授的代码:

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

strlen给出字符串的长度,并为终止字符添加一个长度。现在,长度可以设置为整个字符串的大小,也就是说,教授现在可以为字符串的大小分配足够的字符字节,在本例中为长度。

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

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

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

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

我曾经使用过的一个技巧,但不是很自豪,就是将一个char向量作为结构中的最后一个元素,给它一个零或1大小,然后使用offsetof宏加上字符串所需的大小为结构和字符串分配足够的内存。节省1个内存分配,但确实会让人困惑。我很惭愧。@Patrick:酷-我已经做过不止一次了,所以如果它不好,那么我就倍增了不好的一面。我曾经使用过一个技巧,但并不十分自豪,那就是将一个char向量作为结构中的最后一个元素,给它一个0或1大小,然后为该元素分配足够的内存
使用offsetof宏加上字符串所需的大小来创建结构和字符串。节省1个内存分配,但确实会让人困惑。我很惭愧。@Patrick:酷-我已经做过不止一次了,所以如果是坏事,那么我就把坏事成倍增加。