我很困惑为什么你使用动态分配和为数据分配足够内存的概念。所以我们在课堂上介绍了链接列表,并且有以下代码:
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],并且只是浪费了内存。这是个主意吗?谢谢!
答案 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];
。但是,正如你所说,如果尺寸变化很大,那会浪费记忆力。另一方面,创建预定义大小的好处是它可以减少分配,这有时是有益的。