Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
C++ 使用valgrind指针的未初始化值_C++_Arrays_Pointers_Valgrind - Fatal编程技术网

C++ 使用valgrind指针的未初始化值

C++ 使用valgrind指针的未初始化值,c++,arrays,pointers,valgrind,C++,Arrays,Pointers,Valgrind,我目前正在使用valgrind检查我的程序,一个小测试程序给了我一些我无法理解的错误: int size=10; int i; float * v1; v1=new float[size]; float v2[size]; for (i=0;i<size;i++) v1[i]=0; for (i=0;i<size;i++) v2[i]=0; v1[0]=1; v2[0]=1; int size=10; int i; 浮动*v1; v1=新浮点数[大小]; 浮动v2[大小];

我目前正在使用valgrind检查我的程序,一个小测试程序给了我一些我无法理解的错误:

int size=10;
int i;

float * v1;
v1=new float[size];

float v2[size];

for (i=0;i<size;i++) v1[i]=0;
for (i=0;i<size;i++) v2[i]=0;

v1[0]=1;
v2[0]=1;
int size=10;
int i;
浮动*v1;
v1=新浮点数[大小];
浮动v2[大小];

对于(i=0;i您已经为v1动态分配了内存,但没有初始化它。此时它可能包含任何内容

为什么会发生这种情况

可能是因为您在初始化内存之前读取了它

编辑:根据您添加的代码,在初始化之前您不会读取内存。似乎valgrind只是偏执狂,错误是误报。如果您打算将所有元素设置为相同的值,则使用值初始化会更简单

另外,使用上面v2中的数组是否是最佳实践

是的,但不是因为没有错误。读取未初始化的堆栈内存和读取未初始化的动态内存一样错误


通常,具有自动存储持续时间的变量优先于具有动态存储持续时间的变量。除非数组很大,否则您不想占用宝贵的堆栈空间。或者如果
size
不是编译时间常数,则无法在堆栈上分配它。

valgrind不会跟踪堆栈分配给我的空间在所有情况下都是错误。在v2中可能会出现相同的错误,但valgrind将无法报告。此外,显示valgrind的输出,以及valgrind抱怨的代码行-valgrind不应该抱怨这里的几行代码,因此您在某个地方有更多的代码。为什么未初始化的变量会给出错误?一名
 v1[]
(可能还有
v2[]
以及nos所说的)未初始化。请使用
v1=new float[size]={0.0};
或类似工具。您确实应该在
//do stuff
中显示任何读取
v1[]的内容
,因为Valgrind对您的逻辑很可能是正确的,而且您确实隐藏了一个更深层次的错误。这不应该是一个错误……除非
//do stuff
从内存中读取。
v1=new float[size];
for (i=0;i<size;i++) v1[i]=0;
v1[0]=1;