如何在c ++中将字符串变量的值赋给结构的字符串变量?

时间:2016-12-05 03:27:33

标签: c++ string struct

我正在尝试将字符串变量的值赋给结构的另一个字符串变量。但是gdb给出了运行时错误。错误如下:     程序接收信号SIGSEGV,分段故障。     std :: string :: assign中的0xb7f7c8f8(std :: string const&)()        来自/ usr / lib / i386-linux-gnu / libstdc ++。so.6

我的C ++程序是:

#include<iostream>
#include<stdlib.h>
#include<string>
typedef long unsigned int LUI;
using namespace std;
struct graph {
    string string_node;
    LUI node;
    struct graph *link;
};
struct graph *abc[30];
struct graph *t;
string x;
int main() {
    t = (struct graph *) malloc(sizeof(struct graph *));
    x = "abc";
    t->string_node = x;
    t->link = NULL;
    abc[0] = t;
    cout << "Value is " << abc[0]->string_node << endl;
    cout << "end";

    return 0;
}

请帮我将x的值存储到t-&gt; string_node中。提前谢谢..

2 个答案:

答案 0 :(得分:2)

t = (struct graph *) malloc(sizeof(struct graph *));

graph是一个班级。它包含C ++类,特别是它包含std::string

必须使用new运算符在动态范围内构造所有C ++类。它们不能用C库函数malloc()构造,它对C ++类完全没有任何意义。这样做会导致未定义的行为(更不用说你的malloc-ed大小错了)。

现在您正在编写C ++代码,您需要完全忘记malloc()realloc()free()曾经存在过,并始终使用new和{{ 1}}。

答案 1 :(得分:1)

您的问题是,您使用struct分配了malloc,但struct只有POD(普通旧数据)成员:它有一个{{ 1}}成员和std::string个对象期望构造。简单地为std::string分配内存不会调用malloc构造函数,因此稍后尝试与std::string进行交互将导致未定义的行为,因为该对象处于错误状态。 / p>

您应该使用std::string来分配new,这将正确分配内存为每个成员调用默认构造函数。 (相反,您应该使用struct而不是delete释放该内存,以正确调用每个成员的析构函数。)

或者,可以使用"placement new"在已经分配的内存中构造一个对象,但这不是您通常需要做的事情。