条件跳转,未初始化的值,c++基本代码
Valgrind: Conditional jump, uninitialised value, C++ basic code
这是我的第一个问题,我目前正在学习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
)之后,您的程序可以合法地执行任何。
但是在你的代码中有更多的错误:
- 您在退出
main
之前没有ptr
指向的delete
d数组。 - 你不能通过分配指针来复制数组的内容(
ptr = tmp
)。要做到这一点,你需要迭代数组并逐个复制元素。 - 你的语句
delete [] ptr;
永远不会被执行。
还有一个一般的注意事项:如果学习指针不是你的目标,避免使用它们——在你的情况下,正确的解决方案是使用std::vector
。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值