用C ++打印char *

时间:2009-06-28 07:19:57

标签: c++ printing pointers char

我正在写一个简单的程序。里面只有一节课。有一个私人成员'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
}

当然,我错过了什么......但是什么?

(因为这是我的第一篇文章......你认为标签是否已经更正......你会如何标记帖子?)

提前谢谢你:)

4 个答案:

答案 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
}

希望有所帮助!!!