0

C++ の入門コースを受講していますが、コピー機能でプログラムのセグメンテーション違反が発生しています。GDB を使用すると、位置 0x0 の char * にアクセスできないと表示されます。奇妙なことは、この関数を以前に何度もエラーなしで書いたことです。

class question 
{
public:
question();
~question();
int set_question(char * question);
int copy_question(question & to_copy);
int clear_question();
int display(); 
char* retrieve_question();
char* retrieve_answer(); 
private:
char* your_question;
char* correct_answer;

};

///////////////////

int question::set_question(char * question)
{
your_question = new char [strlen(question)+1];
strcpy(your_question, question);

}

これはGDBのエラーコードです

プログラム受信信号 SIGSEGV、セグメンテーション違反。[スレッド 1 (LWP 1) に切り替え] 0x00013af8 in question::set_question (this=0x0, question=0x257a8 "映画は好きですか??") at question.cpp:51

51 your_question = new char [strlen(質問)+1];

(gdb) p strlen(質問)

$1 = 27

(gdb) p あなたの質問

アドレス 0x0 のメモリにアクセスできません

4

2 に答える 2

0

私はC++の専門家ではありませんが、メンバー関数を呼び出す前にset_question、クラスを初期化していますquestionか? questionクラスが初期化されていないようです。

于 2013-07-29T03:26:27.133 に答える
0

初期化されていないオブジェクトで set_question メソッドを呼び出しています。これは、GDB 出力から確認できます。

question::set_question (this=0x0, question=0x257a8 "do you like movies??")

「これ」は 0x0 であってはなりません

問題はこの方法の外にあります。基本的に、「質問」オブジェクト全体が存在しないため、新しく割り当てられた配列を「your_question」メンバーに割り当てることはできません。

おそらく次のことを正確に行っているわけではありませんが、これで問題が説明できるはずです。

question *q = NULL;
q->set_question(...);
于 2013-07-30T16:08:20.140 に答える