Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确初始化类函数中的指针?_C++_Function_Class_Pointers - Fatal编程技术网

C++ 如何正确初始化类函数中的指针?

C++ 如何正确初始化类函数中的指针?,c++,function,class,pointers,C++,Function,Class,Pointers,我正在使用一个类中声明的指针数组来指向另一个数组。当指针数组元素初始化为main中的某个值时,该值也会被带到它所指向的数组元素。下面的代码显示了这一点,并且工作正常。但是,如果我在init类函数中初始化指针,我会得到一个segfault。另外,如果我试图从指针数组中访问一个未在main中初始化的元素,我也会得到一个segfault #include <stdio.h> #include <stdlib.h> #include <iostream> using

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

#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";
}

有没有一种方法可以在类函数中初始化指针数组而不导致segfault?

这是因为LWgt中存储的指针都没有指向任何有效的指针。请记住,运行时将使用一些随机值初始化指针,这些随机值可能是有效地址,也可能不是有效地址。当你试图在一个无效地址中填充一个值时,你会得到一个错误

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

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函数。

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

    LWgt = new double*[26];
为26 double*分配内存,但不为指针本身分配内存

线路

    *LWgt[5] = 22.34543; 
导致未定义的行为,因为尚未为LWgt的任何元素分配内存

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


请正确缩进你的代码。你是怎么做到的?我刚刚用了ctrl k。你听说过构造函数吗?你从哪里学的这些东西?是的,我知道构造函数和析构函数,但我通常不使用它们。这能让它工作吗?行LWgt=new double*[26];将指针类型的26个元素分配给double。所有这些元素都没有指向任何东西。非常感谢这一点,现在我想起来它是如此明显——我需要像对待其他数组一样对待指针数组。谢谢你。
LWgt[5] = new double[<SOME_SIZE>];  // Allocate an array
LWgt[5] = new double; // Allocate just one element.