编译器在以下代码上抛出运行时段错误:
#include <iostream>
#include <string>
using namespace std;
struct Node{
int data;
void *next;
string nodeType;
};
Node* initNode(int data){
Node *n = (Node*)malloc(sizeof(Node));
n->data = data;
n->next = NULL;
n->nodeType = "Node"; //if this line is commented it works else segfault
return n;
}
int main() {
Node *n1 = initNode(10);
cout << n1->data << endl;
}
有人可以解释为什么字符串赋值在动态分配的结构中不起作用,而在静态分配的情况下为什么它起作用?
它的工作方式如下:
Node initNode(string data){
Node n;
n.data = data; //This works for node creation statically
n.next = NULL;
n.nodeType = "Node"; //and even this works for node creation statically
return n;
}
然后在主函数中:
int main() {
Node n2 = initNode("Hello");
cout << n2.data << endl;
}
这是行不通的,因为你实际上并没有将一个
Node
实例构建到你malloc
.的内存中
你应该使用
new
代替:
Node *n = new Node{};
malloc
只分配内存,它不知道类是什么或如何实例化一个类。你通常不应该在 C++ 中使用它。
new
分配内存 and 构造类的实例。
没有执行 std::string 构造函数的地方。
你应该使用新的
example *e = new example;
或安置新
void *example_raw = malloc(sizeof(example));
example *e = new(example_raw) example;
Node *n = (Node*)malloc(sizeof(Node));
这个演员是胡说八道。你不能只是告诉编译器假装你刚刚分配的数据块包含一个有效的
Node
对象然后操纵它。
string
在 C++ 中是一个类,创建字符串对象使用 new
而不是 malloc,如下所示。
Node *n = new Node{};