int* g () {
int j = 2;
return &j;
}
int main () {
using namespace std;
int v = *g();
// assert(v == 2); // Valgrind: Conditional jump or move depends on uninitialised value(s)
}
因此,该断言导致Valgrind错误,但我不太确定该错误意味着什么,以及为什么我不允许在该语句上调用assert。
在断言之前已经初始化了'v',那么为什么会导致该错误呢?
提前谢谢你。
答案 0 :(得分:2)
j
已经初始化,但是一旦依赖它具有任何特定价值,即当它超出范围时就会变得非法,从而实际上没有初始化。
此代码返回指向j
:
int* g () {
int j = 2;
return &j;}
此代码取消引用该指针:
int v = *g();
但j
不再存在 - 当g
返回时,它超出了范围。您不能取消引用指向不再存在的变量的指针。