【问题标题】:Printing a char* in C++在 C++ 中打印一个 char*
【发布时间】:2009-06-28 07:19:57
【问题描述】:

我正在编写一个简单的程序。里面只有一门课。有一个私有成员 'char * number' 和两个函数(会有更多,但首先这些应该可以正常工作:))。

第一个应该将'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
}

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

(因为这是我的第一篇文章……您认为标签是否已更正……您将如何标记该帖子?)

提前谢谢你:)

【问题讨论】:

    标签: c++ printing pointers char


    【解决方案1】:

    您的 number char* 数组在退出构造函数时将超出范围。当您到达 print() 时,由于程序不再有权访问 *number 最初指向的内存,它会崩溃(即分段错误)。要解决此问题,请改为:

    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 变量,因为您不必自己处理内存管理开销,并且复制字符串也会更容易。

    【讨论】:

      【解决方案2】:

      LongNumber 构造函数中,您声明一个名为number 的新局部变量并使用新的char 数组对其进行初始化:

      char* number = new char[digits+1];
      

      相反,您应该省略char*,这样它就不会看起来像一个新的变量声明并使用对象成员变量:

      number = new char[digits+1];
      

      使用当前代码,成员变量 number 永远不会被初始化,并且稍后在 print 中使用它会导致错误。

      【讨论】:

        【解决方案3】:

        您的问题出在构造函数中:

        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 );
          ...
        }
        

        【讨论】:

          【解决方案4】:

          在我看来,您将数字声明为局部变量。如果您希望能够在另一个函数中再次调用它,则必须在类定义中声明它......就像这样:

          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
          }
          

          希望对你有帮助!!!

          【讨论】:

          • 糟糕,似乎有一百万人回答了这个问题,而我……对此感到抱歉:)
          • 取决于人们的深度以及可以使代码更易于管理的其他建议
          猜你喜欢
          • 2021-11-01
          • 2013-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-10
          • 1970-01-01
          • 2016-03-02
          • 1970-01-01
          相关资源
          最近更新 更多