分段故障

时间:2013-03-08 14:33:10

标签: c++ stl segmentation-fault

试图跟踪,但没有找到以下代码在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();
}

3 个答案:

答案 0 :(得分:12)

为什么你认为它应该有效?您使用malloc而不是new,因此不会调用任何构造函数,并且您执行的所有操作都会访问未初始化的内存。

答案 1 :(得分:5)

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

以下内容:

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

应该阅读

head = new NODE;

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

答案 2 :(得分:0)

我同意以前的答案。

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

在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_caststatic_castconst_castreinterpret_cast(参见here