2016-12-05 25 views
0

文字列変数の値を構造体の別の文字列変数に代入しようとしています。しかしgdbは実行時エラーを出します。エラーは次のとおりです。 プログラム受信信号SIGSEGV、セグメンテーションフォルト。 std ::文字列::アサイン(STD ::文字列のconst &)() C++の構造体の文字列変数に文字列変数の値を代入する方法は?

私のC++プログラム/usr/lib/i386-linux-gnu/libstdc++.so.6からで 0xb7f7c8f8は次のとおりです。

#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-> string_nodeに保存するのを手伝ってください。ありがとうございます。

+0

試しになる前にcppのレッスンを読んだことがありますか?あなたは本当にすべきです。 http://www.learncpp.com/ – Stargateur

+1

メモリを正しく割り当てるには 'new'を使います。 –

答えて

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

はクラスです。これにはC++クラスが含まれており、具体的にはstd::stringが含まれています。

すべてのC++クラスは、new演算子を使用して動的スコープで構築する必要があります。それらは、Cライブラリ関数malloc()で構築することはできません。これは、C++クラスについてはまったく何も知っていません。そうすることで、未定義の動作になります(malloc-edのサイズが間違っているとは言えません)。

は、今あなたがC++のコードを書いていることを、あなたは完全にmalloc()realloc()、およびfree()が今まで存在していたことを忘れて、そして常にnewdeleteを使用する必要があります。

1

あなたの問題はあなたがmallocstructを配分しているということですが、それstructのみPOD(プレーン旧データ)のメンバーを持っていない:それはstd::string部材を有する、とstd::stringオブジェクトがをを構築することを期待しています。 mallocでメモリを割り当てるだけでは、std::stringコンストラクタは呼び出されません。したがって、後でそのオブジェクトと対話しようとすると、オブジェクトの状態が悪いため未定義の動作になります。

かわりに、あなたのstructを割り当てるnewを使用する必要があり、それが適切にメモリを割り当て、各メンバーのデフォルトコンストラクタを呼び出します。 (逆に、適切に各部材のデストラクタを呼び出すためdelete代わりにfreeとそのメモリを解放しなければならない。)

あるいは、あなたが既に割り当てられてきたメモリ内にオブジェクトを構築する"placement new"を使用することが可能であるが、これはあなたが通常行う必要があるものではありません。

+0

ありがとう...それは新しいを使用した後に動作します... –

関連する問題