2017-04-05 95 views
0

我正在使用在類中聲明的指針數組指向另一個數組。當一個指針數組元素被初始化爲一個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"; 
} 

有沒有辦法在類函數內初始化指針數組而不導致段錯誤?

+2

請妥善縮進代碼。 –

+0

你怎麼做,我只是用CTRL k。 – hbyte

+0

您是否聽說過施工人員?你從哪裏學習這些東西? –

回答

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

+0

非常感謝,因爲它非常明顯,現在我想到了 - 我需要將指針數組視爲任何其他數組。謝謝。 – hbyte

+0

是的,多數民衆贊成在固定它很好,再次感謝。 – hbyte

0

Lwgt是指向double數組的指針數組。您必須分配數組中的每個元素或刪除聲明中的**。

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.