Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Valgrind:条件跳跃,未初始化值,C++基本代码 这是我的第一个问题,我现在正在学习C++,我正在研究如何使用ValgRink。这个程序从71个错误开始,我已经能够将它最小化到2,我无法理解剩下的问题,因为我缺乏C++的经验。有人能帮我找出哪里出了问题,或者至少给我指出一个好的方向吗?我明白错误告诉我的是什么,我只是没有看到问题。谢谢你的帮助_C++_Valgrind - Fatal编程技术网

Valgrind:条件跳跃,未初始化值,C++基本代码 这是我的第一个问题,我现在正在学习C++,我正在研究如何使用ValgRink。这个程序从71个错误开始,我已经能够将它最小化到2,我无法理解剩下的问题,因为我缺乏C++的经验。有人能帮我找出哪里出了问题,或者至少给我指出一个好的方向吗?我明白错误告诉我的是什么,我只是没有看到问题。谢谢你的帮助

Valgrind:条件跳跃,未初始化值,C++基本代码 这是我的第一个问题,我现在正在学习C++,我正在研究如何使用ValgRink。这个程序从71个错误开始,我已经能够将它最小化到2,我无法理解剩下的问题,因为我缺乏C++的经验。有人能帮我找出哪里出了问题,或者至少给我指出一个好的方向吗?我明白错误告诉我的是什么,我只是没有看到问题。谢谢你的帮助,c++,valgrind,C++,Valgrind,以下是程序代码: #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 (ar

以下是程序代码:

  #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得到的错误输出:
上面说我需要10个名声才能把它贴成图片,对不起

正如WhozCraig正确指出的,您的问题之一在于函数initArray。我不确定你想在其中实现什么,但对我来说,你可以简单地忽略它,使用int*ptr=newint[n];在第38行

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

但是在你触发initArray中的UB之后,你的程序可以合法地做任何事情

但您的代码中还有更多错误:

在退出main之前,您没有删除ptr指向的阵列。 不能通过分配指针ptr=tmp来复制数组的内容。要做到这一点,您需要遍历数组并逐个复制元素。 您的声明删除[]ptr;永远不会被处决。
还有一点需要注意:如果学习指针不是你的目标,那么就避免它们——在你的情况下,正确的解决方法是使用std::vector。

解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,您应该[编辑]您的问题,以包括一个重现您的问题的示例,以及您在调试器中所做的观察。initArray返回即将死亡的int arr[n]的地址。您的代码调用未定义的行为。为什么在代码中使用这么多指针?这些是不必要的,并且使您的代码脆弱且容易出错。它说我需要10个信誉才能将其作为图像发布,对不起!出于充分的理由,您必须尽可能多地以文本形式发布信息。要添加,doubleArray具有多个逻辑值。在设计算法时,不要编写算法代码。设计它,然后编写代码。Fwiw,fillArray看起来是正确的,所以您可以使用它,displayArray也是如此,尽管在那里指针参数理想情况下应该是const。