我正在写一个简单的程序。里面只有一节课。有一个私人成员'char *号码'和两个函数(会有更多,但首先这些应该正常工作:))。
第一个应该将'source'复制到'number'变量中(我想这里有问题):
LongNumber::LongNumber(const char * source ){
int digits = strlen(source);
char* number = new char[digits+1];
strcpy( number, source );
// cout<<number<<endl; - if the line is uncommented,
// the output is correct and there isn't a problem
}
打印功能:
void LongNumber::print(){
cout<<number<<endl;
// when I try to print with the same line of code here..it crashes
}
当然,我错过了什么......但是什么?
(因为这是我的第一篇文章......你认为标签是否已经更正......你会如何标记帖子?)
提前谢谢你:)
答案 0 :(得分:6)
当你的数字char *数组退出构造函数时,它将超出范围。当你到达print()时,由于程序不再能访问*号最初指向的内存,它会崩溃(即分段错误)。要解决此问题,请执行以下操作:
class LongNumber
{
char *number;
LongNumber(const char *source);
~LongNumber();
void print();
};
LongNumber::LongNumber(const char * source ){
int digits = strlen(source);
number = new char[digits+1];
strcpy( number, source );
}
void LongNumber::print(){
cout<<number<<endl;
}
不要忘记执行以下操作:
LongNumber::~LongNumber()
{
delete [] number; // to avoid memory leaks
}
我还强烈建议使用STL :: string而不是使用char *作为* number变量,因为您不必自己处理内存管理开销,复制字符串也会更容易。
答案 1 :(得分:5)
在LongNumber
构造函数中,您声明了一个名为number
的新局部变量,并使用新的char
数组对其进行初始化:
char* number = new char[digits+1];
相反,你应该省略char*
,这样它看起来就像一个新的变量声明并使用对象成员变量:
number = new char[digits+1];
使用当前代码,成员变量number
永远不会被初始化,稍后在print
中使用会导致错误。
答案 2 :(得分:1)
您的问题出在您的构造函数中:
LongNumber::LongNumber(const char * source )
{
...
// you are declaring a new local variable called `number` here
char* number = new char[digits+1];
strcpy( number, source );
...
}
您没有复制到名为number
的类成员变量中,您在构造函数的主体中声明了一个新的局部变量并使用它。类成员变量未使用,可能未定义。对于指针成员,这意味着该值可以是任何无效值 - 然后当您调用print:
void LongNumber::print()
{
cout<<number<<endl;
// when I try to print with the same line of code here..it crashes
}
你在这里使用的number
是类成员变量,正如我们所说的那样是未定义的。对cout
的调用随后会崩溃,因为它会尝试使用该无效指针。
修复方法是使构造函数使用正确的类成员变量:
LongNumber::LongNumber(const char * source )
{
...
// use the class member variable `number` here
number = new char[digits+1];
strcpy( number, source );
...
}
答案 3 :(得分:1)
在我看来,你将声明的数字称为局部变量。如果你想在另一个函数中再次调用它,你必须在类定义中声明它......就像这样:
class LongNumber{
public:
int digits;
char* number;
LongNumber(const char * source );
void print();
}
LongNumber::LongNumber(const char * source ){
digits = strlen(source);
number = new char[digits+1];
strcpy( number, source );
// cout<<number<<endl; - if the line is uncommented,
// the output is correct and there isn't a problem
}
void LongNumber::print(){
cout<<number<<endl;
// when I try to print with the same line of code here..it crashes
}
希望有所帮助!!!