2016-09-23 81 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正確指出的那樣,您的問題之一在於函數initArray。我不確定你想在其中實現什麼,但對我來說,它看起來像你可以簡單地省略它,並在第38行使用int* ptr = new int[n];

本質上,你返回指向堆棧上未啓動內存的指針,然後嘗試分配大小與其指向的任何大小相同的數組。 Valgrid的消息告訴你。

但是,在您觸動UB(initArray)後,您的程序合法可以做任何事情

但也有你的代碼更錯誤:

  1. 你沒有delete退出main之前ptr指出d陣列。
  2. 您不能通過指定指針來複制數組的內容(ptr = tmp)。爲此,您需要遍歷數組並逐個拷貝元素。
  3. 您的陳述delete [] ptr;將永遠不會執行。

而且一個一般說明:如果學習指針不是你的目標,請避免它們 - 在你的情況下,正確的解決方案是使用std::vector

相關問題