Segfault尝试strcpy char *

时间:2013-07-29 00:26:49

标签: gdb segmentation-fault strlen strcpy

我在C ++入门课程中,我的程序在我的复制功能中是segfaulting。当我使用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 :: set_question(这= 0x0,问题= 0x257a8“你喜欢电影吗?”)       在question.cpp:51

     

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

     

(gdb)p strlen(问题)

     
    

$ 1 = 27

  
     

(gdb)p your_question

     
    

无法访问地址0x0

的内存   

2 个答案:

答案 0 :(得分:0)

我在C ++方面不专业,但在你调用成员函数set_question之前,你是否初始化了类question?似乎question类未初始化。

答案 1 :(得分:0)

您正在非初始化对象上调用set_question方法。你可以从GDB输出中看到这个:

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

'this'不应该是0x0

问题不在于此方法。基本上,新分配的数组不能分配给'your_question'成员,因为整个'question'对象不存在。

您可能没有做到以下几点,但这应该说明问题:

question *q = NULL;
q->set_question(...);