2016-09-23 41 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

相关问题