2016-11-21 13 views
0

大きな乱数の配列を取得しようとしていて、その配列を、値が対応する10個の要素を持つ新しい配列を作成する関数に渡そうとしています。大きな配列の値を使用します。パラメータstartを関数に渡して、大きな配列のインデックスを示します。この配列から、値を小さな配列にコピーし始めます。配列へのポインタを関数に渡すときのセグメンテーションフォールト(C++)

私の説明は、私は20のランダムに生成された番号の配列Aを有する、明らかではない場合:
A = {1、2、3、... 20}

私がしたいです最初の10個の数字を保持する配列Bを作る:
B = {1、2、3、... 10}

及び第二10を保持する配列のC:
C = { 11,12,13、... 20}

私は乱数を生成し、ループのためにそれらを表示することができるよ、私は、私はターミナルでセグメンテーションフォールトを取得する新しいアレイにしようとして始めると:

(コアダンプ)
セグメンテーションフォールトを

以下は私のコードです。

int main() { 

    int size = 20; 
    int *arrA = getRandomScores(size); 

    int *arrB = applyScores(arrA, 0); 
    int *arrC = applyScores(arrA, 10); 

    for(int i = 0; i < 10; i++) { 
     cout << arrB[i] << endl; 
    } 
    cout << endl << endl; 
    for(int i = 0; i < 10; i++) { 
     cout << arrC[i] << endl; 
    } 

    return 0; 
} 

int *applyScores(int *arr, int start) { 
    int *newArr; 

    for(int i = 0; i < 10; i++) { 
     newArr[i] = arr[start]; 
     start++; 
    }  

    return newArr; 
} 

int *getRandomScores(int size) { 
    int *arr; 

    //return null if size is zero or negative 
    if (size <= 0) 
     return NULL; 

    //dynamically allocate the array 
    arr = new int[size]; 

    //seed the random number generator 
    srand(time(0)); 

    //populate the array with random numbers 
    for(int i = 0; i < size; i++) 
     arr[i] = rand() % 100; 

    return arr; 
} 

私は、Linux上でので、私は、より詳細なエラーメッセージを表示するためにvalgrindのを使用するように言われました。以下はvalgrindが私に与えたものです。これはセグメンテーションフォルトとの最初の遭遇です。その答えがvalgrindの助けを借りて些細なものであれば私を許してください。

valgrind error log screenshot

答えて

3

にメモリを割り当てることはありませんあなたはintへのポインタとしてnewArrを宣言したが、それはどこも指していません。

int *newArr = new int[10]; 

しかし、あなたはそれで行われたときにアレイを削除することを忘れないでください:あなたは、このような新しい配列を作成することができ

delete[] arrB; 
delete[] arrC; 

それとも、単にあなたの配列A、BおよびCのためのstd::vector<int>を使用することができます(または少なくともBとC)。

+0

ええ、それは間違いなく些細なことでした。学んだ教訓!ありがとう! – jreed

1

あなたはBとC

int *applyScores(int *arr, int start) { 
    int *newArr = new int[10]; 

    for(int i = 0; i < 10; i++) { 
     newArr[i] = arr[start]; 
     start++; 
    }  

    return newArr; 
} 
1

valgrind状態(ポインタと無効な書き込みを意味する初期化されていない値の使用)は、ランダムなスコアをarrBarrCにコピーするためにメモリを割り当てません。 applyScores()arrNewは単なるポインタなので、配列を格納することはできません。この種の問題を避ける最も簡単な方法は、標準ライブラリコンテナ、例えばstd::vectorまたはstd::arrayを使用することです。