【问题标题】:How to correctly initialise pointers within class function?如何正确初始化类函数中的指针?
【发布时间】:2017-04-05 21:48:22
【问题描述】:

我正在使用一个类中声明的指针数组来指向另一个数组。当一个指针数组元素被初始化为 main 中的一个值时,该值也被传送到它所指向的数组元素。下面的代码显示了这一点,它工作正常。但是,如果我在 init 类函数中初始化指针,我会得到一个段错误。此外,如果我尝试访问未在 main 中初始化的指针数组中的元素,我也会得到一个段错误。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

class testclass {
public:
    double  *Wgt;
    double* *LWgt;

    void init() {
        Wgt = new double[26];
        LWgt = new double*[26];

        //segfault from here
        *LWgt[5] = 22.34543; 
    }
};

int main() {

    testclass *node;
    node = new testclass[10];

    for (int i = 0; i < 10; i++) {
        node[i].init();
    }

    for (int i = 0; i < 5; i++) {               //init_nconn here
        node[i].LWgt[23] = &node[i + 5].Wgt[12];
    }

    node[6].Wgt[12] = 50.6987;
    node[8].Wgt[12] = 0.999923;

    cout << *node[1].LWgt[23] << *node[3].LWgt[23] << "--\n";

    //No segfault
    *node[1].LWgt[23] = 33.234;

    cout << node[6].Wgt[12] << "---\n";
    //No segfault here
    cout << *node[1].LWgt[23] << "---\n";

    //Segfault from here
    cout << *node[3].LWgt[5] << "---\n";
}

有没有办法在类函数中初始化指针数组而不导致段错误?

【问题讨论】:

  • 请正确缩进您的代码。
  • 你是怎么做到的,我刚用了ctrl k。
  • 你听说过构造函数吗?你从哪里学的这些东西?
  • 是的,我知道构造函数和析构函数,但我通常不使用它们。这会让它工作吗?
  • LWgt = new double*[26]; 行分配了 26 个元素,每个元素类型为双精度指针。这些元素都没有指向任何东西。

标签: c++ function class pointers


【解决方案1】:
    LWgt = new double*[26];

为 26 double* 分配内存,但不为指针本身分配内存。

线

    *LWgt[5] = 22.34543; 

导致未定义的行为,因为尚未为 LWgt 的任何元素分配内存。

为了能够使用它,您必须首先为LWgt[5] 分配内存。

LWgt[5] = new double[<SOME_SIZE>];  // Allocate an array

LWgt[5] = new double; // Allocate just one element.

【讨论】:

    【解决方案2】:

    这是因为LWgt 中存储的指针实际上都没有指向任何有效的东西。请记住,运行时将使用一些可能是也可能不是有效地址的随机值来初始化指针。当您尝试将值填充到无效地址中时,您将收到错误。

    您需要初始化LWgt 中的指针以指向一些实际的double 内存位置,然后才能为它们分配任何值:

    void init() {
        Wgt = new double[26];
        LWgt = new double*[26];
    
        for(int i = 0; i < 26; i++)
            LWgt[i] = new double;
    
        //segfault from here
        *LWgt[5] = 22.34543; 
    }
    

    附带说明,这种初始化可能最好在类的构造函数中完成,而不是在特殊的初始化函数中完成。构造函数的要点是它们总是在类被实例化时自动运行。您不必担心在创建对象后记得立即调用 init 函数。

    【讨论】:

    • 非常感谢,因为它是如此明显,现在我想到它 - 我需要将指针数组视为一个数组,就像任何其他数组一样。谢谢。
    【解决方案3】:

    Lwgt 是一个指向 double 的指针数组。您必须分配数组中的每个元素或删除声明中的 **。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      相关资源
      最近更新 更多