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。