2016-09-23 14 views
-2

これは私の最初の質問です。私は現在C++を学んでおり、Valgrindの使い方を研究しています。このプログラムは71のエラーで始まり、2まで最小限に抑えることができましたが、C++での経験がないため残りの問題を把握することはできません。誰かがここで何がうまくいかないのか、少なくとも私を良い方向に向けるのを助けることができますか?私はエラーが私に言っていることを理解する、私は問題を見ていないだけです。助けてくれてありがとう。ここで Valgrind:条件付きジャンプ、初期化されていない値、C++の基本コード

は、プログラムコードです:

#include <iostream> 
    #include <cstdlib> 
    using namespace std; 

    int* initArray(int); 
    int fillArray(int *, int); 
    int* doubleArray(int *, int); 
    void displayArray(int *, int); 

int main(int argc, char ** argv){ 
    if (argc != 2){ 
     cout << "wrong number of arguments" << endl; 
     exit(1); 
    } 

    int n = atoi(argv[1]); 
    srand(time(0)); 

    int* ptr = new int[*initArray(n)]; //***Here is line 38*** 
    fillArray(ptr, n); 
    displayArray(ptr, n); 

    int* dptr = doubleArray(ptr, n); 
    fillArray(ptr, 2*n); 
    displayArray(ptr, 2*n); 
} 

int* initArray(int n){ 
    int arr[n]; 
    int *ptr = arr; 
    return ptr; 
} 

int fillArray(int *ptr, int n){ 
    for(int i=0; i<n; i++){ 
     ptr[i] = rand() % 100; 
    } 
} 

int* doubleArray(int * ptr, int n){ 
    int size = 2 * n; 
    int * tmp = new int[size]; 
    ptr = tmp; 
    delete [] tmp; 
    return ptr; 
    delete [] ptr; 
} 

void displayArray(int *ptr, int n){ 
    for(int i=0; i<n; i++){ 
     cout << ptr[i] << " "; 
    } 
    cout << endl; 
} 

そして、ここにvalgrindのからの私のエラー出力です: http://i.imgur.com/881nsDw.png (それは、私がイメージとしてそれを投稿する10 repuationが必要と言うごめん!)

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+2

'initArray'は、' int arr [n] 'の直近のアドレスを返します。あなたのコードは*未定義の動作*を呼び出します。 – WhozCraig

+0

なぜあなたのコード内で非常に多くのポインタを使用していますか?これらは必要ではなく、コードが壊れやすく、エラーを起こしやすくなります。 –

答えて

0

WhozCraigが正しく指摘したように、問題の1つは関数initArrayです。私はあなたがそれに達成するために何を望むかわからないんだけど、私にとって、それはあなたが単にそれを省略し、ライン38

int* ptr = new int[n];を使用することができるように基本的にあなたがスタック上に初心者メモリへのポインタを返し、その後にしようとしたに見えますそれが指しているものと同じサイズの配列を割り当てます。ヴァルグリッドメッセージがあなたに言った。

あなたがUBをトリガーした後(initArray)、あなたのプログラムは法的に何かを行うことができます。

しかし、より多くのエラーは、あなたのコードであります

  1. あなたはmainを終了する前に、ptrによって指さdelete D配列ませんでした。
  2. ポインタ(ptr = tmp)を割り当てることによって配列の内容をコピーすることはできません。これを行うには、配列を反復処理し、要素を1つずつコピーする必要があります。
  3. お客様のステートメントdelete [] ptr;は決して実行されません。

1つの一般的な注意点:ラーニングポインタが目的でない場合は、回避してください。正しい解決方法はstd::vectorです。

関連する問題