如何在类函数中正确初始化指针?

时间:2017-04-05 21:48:22

标签: c++ function class pointers

我正在使用一个在类中声明的指针数组来指向另一个数组。当指针数组元素初始化为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";
}

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

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

那是因为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函数。

答案 2 :(得分:0)

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