0

试图跟踪,但没有找到以下代码在 VC++ 中给出“访问冲突”以及在 gcc 中给出分段错误的原因。

#include <vector>
#include <iostream>
using namespace std;

typedef struct node
{
    std::string data;
    vector <struct node*> child;
}NODE, *PNODE;

int main()
{
    PNODE head;
    head = (PNODE) malloc(sizeof(NODE));

    head->data.assign("hi");

    printf("data %s", head->data.c_str());
    getchar();
}
4

3 回答 3

12

为什么你认为它应该起作用?您使用malloc, 而不是new, 因此不会调用构造函数,并且您所做的一切都会访问未初始化的内存。

于 2013-03-08T14:34:52.603 回答
5

使用new而不是malloc在堆上创建 C++ 对象。

以下:

head = (PNODE) malloc(sizeof(NODE));

应该读

head = new NODE;

原因malloc()在这里不起作用是它不调用对象构造函数。

于 2013-03-08T14:35:16.177 回答
0

我同意以前的答案。

我应该补充一点,最好避免using namespace(见这里

在 C++ 中,避免使用类似 C 的结构声明:

typedef struct node
   {
       std::string data;
       vector  child;
   }NODE, *PNODE;

应该:

struct Node
{
    std::string data;
    std::vector<Node> child;
}

然后:

Node head;

或者:

Node* head = new Node;

如果您使用的是 c++,请使用std::cout代替printf

也有 c++ 强制转换运算符:dynamic_cast、、、(见这里static_castconst_castreinterpret_cast

于 2013-03-08T14:45:12.770 回答