试图跟踪,但没有找到以下代码在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();
}
答案 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_cast
,static_cast
,const_cast
,reinterpret_cast
(参见here)