提问者:小点点

无法读取链表中的字符串变量


我正在尝试创建一个链表,该链表将存储单词以及它们在。txt文件中出现的次数。在阅读之前,我试着创建一个链表,看看是否可以。在测试时,它正在崩溃。

#include <iostream>
#include <string>
struct n {

    std::string word;
    int occurance;
    n* next;
};

typedef n node;

int main() {
    node* root;
    root = (node*)malloc(sizeof(node*));
    
    root->word = "test";
    root->occurance = 5;

    std::cout << root->word
        << root->occurance << std::endl;
}

错误


共3个答案

匿名用户

是C的延续,这是C在上个世纪的发展方式。它会编译,但那多半是坏运气。

只需至少移动到1998年,并使用,或者。解释为什么过时的技术会失败并不是那么有用。

匿名用户

获取指向的指针的大小。可能是4或8个字节。分配了那么多字节。

但是比指向的指针大。然后你的代码填充所有的数据,并经过它分配的内存的末尾,因为它只为一个指针分配了足够的空间。

解决方案1:将更改为

解决方案2:将更改为,因为它是C++(不是C),您可以这样做。

另外,不要忘记释放它(codefree(root)/code>用于用于)。当程序结束时,操作系统会自动释放你所有的东西,所以这在这个短程序中并不重要,但是当你做一个需要很多东西的程序时,你必须释放一部分的内存,以便下一部分可以重用它。

匿名用户

root = (node*)malloc(sizeof(node*));

在两个方面都是错误的。您应该使用

root = new node;

首先,代码将为(通常为4或8字节)分配空间,而不是为分配空间。

其次,只分配内存,不初始化内存。请参见在什么情况下我使用malloc和/或new?sup1/sup>这意味着新分配的的所有成员都具有不确定的值,读取它们将导致未定义的行为。在您的例子中,这表现为访问权限。

在现代C++中,您应该避免这两种情况)