2014-02-19 56 views
0

頁眉分割錯誤並返回存儲在元素中的值?

#ifndef INTVECTOR_H 
#define INTVECTOR_H 

using namespace std; 
class IntVector{ 
private: 
    unsigned sz; 
    unsigned cap; 
    int *data; 
public: 
    IntVector(); 
    IntVector(unsigned size); 
    IntVector(unsigned size, int value); 
    unsigned size() const; 
    unsigned capacity() const; 
    bool empty() const; 
    const int & at (unsigned index) const; 
}; 

#endif 

主要

#include "IntVector.h" 
#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

vector<int> iVector; 
int *array; 
IntVector::IntVector(){ 
    sz = 0; 
    cap = 0; 
    *data = NULL; 
    vector<int> iVector (sz); 
    iVector.reserve(sz); 
} 

IntVector::IntVector(unsigned size){ 
    sz = size; 
    iVector.resize(sz); 
    iVector.reserve(sz); 
    cap = iVector.capacity(); 
    array = new int[sz]; 
    array = 0; 
} 

IntVector::IntVector(unsigned size, int value){ 
    sz = size; 
    iVector.reserve(sz); 
    cap = iVector.capacity(); 
    array = new int[sz]; 
    for(int i = 0; i < sz; i++){ 
     array[i] = value; 
    } 
} 

unsigned IntVector::size() const{ 
    return sz; 
} 

unsigned IntVector::capacity() const{ 
    return cap; 
} 

bool IntVector::empty() const{ 
    if(sz > 0){ 
     return false; 
    } 
    else{ 
     return true; 
    } 
} 

const int &IntVector::at(unsigned index) const{ 
    if(index > sz){ 
     exit(0); 
    } 
    else{ 
     return array[index]; 
    } 
} 

我有試圖設定INT *數據爲NULL,因爲我得到一個分割錯誤這個討厭的問題。我應該使用什麼方法將數據分配給IntVector中的Null以避免分段錯誤?它看起來不像我正在重新分配任何*數據,所以我有點困惑。

我的問題的第二部分是函數IntVector :: at。它應該返回存儲在傳入的索引位置元素的值,但我不知道如何直接返回值,因爲它是一個動態分配的數組,我在Google上讀到的內容很混亂。我是否必須使用特殊參數才能訪問該值?謝謝。

+1

也許有點偏離主題,但'退出(0);'爲一個無效索引?人們應該如何弄清楚什麼是錯的?你可能會考慮拋出異常。並且'array'和'iVector'發生了什麼?他們不屬於你的班級,並且像他們一樣使用他們會嚴重地使你受到傷害。 – chris

+0

對於我的任務,我必須像IntVector(無符號大小)一樣動態分配一個數組「將IntVector的大小和容量都設置爲傳入的參數的值,並動態分配一個該大小的數組。 – user3314899

+0

是的,這就是'data'的用途。 – chris

回答

2
*data = NULL; 

你不設置dataNULL(喜歡nullptr),你在*data設置價值NULLdata這裏是一個未初始化的指針,因此取消引用它是無效的。

你想要的是什麼:

data = NULL; 

或者,更好

data = nullptr; 

或者,最好的,使用初始化列表。

IntVector::IntVector() : sz(0), cap(0), data(nullptr) 
{ 
    // I removed your vector initialization since 
    // you're just using sz, which has a value of 0. 
    // iVector is already initialized here, but I don't 
    // believe that you mean to shadow it as you are doing. 
    // iVector is declared statically, and then again here. 
} 
0
*data = NULL; 

設置存儲器位置爲NULL的內容。但是由於數據尚未指向任何地方,這是無效的。