条件跳转,未初始化的值,c++基本代码

Valgrind: Conditional jump, uninitialised value, C++ basic code

本文关键字:c++ 代码 初始化 条件      更新时间:2023-10-16

这是我的第一个问题,我目前正在学习c++,我正在研究如何使用Valgrind。这个程序开始时有71个错误,我已经能够将其减少到2个,我只是无法找出剩余的问题,由于我对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的错误输出:https://i.stack.imgur.com/SsPtr.png(它说我需要10声誉发布它作为一个图像,对不起!)

正如WhozCraig正确指出的那样,您的问题之一在于功能initArray。我不确定您想在其中实现什么,但对我来说,看起来您可以简单地省略它并在第38行使用int* ptr = new int[n];

实际上你返回了一个指向堆栈上未初始化内存的指针,然后试图分配一个大小等于它所指向的大小的数组。Valgrid的消息告诉你了。

但是在您触发UB(在initArray)之后,您的程序可以合法地执行任何

但是在你的代码中有更多的错误:

  1. 您在退出main之前没有ptr指向的delete d数组。
  2. 你不能通过分配指针来复制数组的内容(ptr = tmp)。要做到这一点,你需要迭代数组并逐个复制元素。
  3. 你的语句delete [] ptr;永远不会被执行。

还有一个一般的注意事项:如果学习指针不是你的目标,避免使用它们——在你的情况下,正确的解决方案是使用std::vector