这个问题在这里已有答案:
我有以下代码:
typedef void* EstimatedValue;
EstimatedValue myFunction()
{
int myVal = 16;
EstimatedValue value = &myVal ;
return value;
}
bool intLessOrEqual(EstimatedValue value1, EstimatedValue value2)
{
return *(int*)value1 <= *(int*)value2;
}
而这个主要功能:
int x = 8;
EstimatedValue val = myFunction();
EstimatedValue x1 = &x;
intLessOrEqual(x1, val);
但是,第二个参数(在函数中创建的参数)的值在intLessOrEqual
函数内部已损坏(值为-858993460)。如果我尝试在*(int*)val
函数内访问main
它可以正常工作。这种行为可能是什么原因?可以做些什么来避免这种行为
myVal
是在myFunction
函数的堆栈中创建的。而你正在返回一个地址。这会导致未定义的行为,因为myVal
的值一旦超出范围就会改变。
你可以做的是为这样的值创建内存:
EstimatedValue value = malloc(sizeof(int);
分配值:
*value = 16;
return value;
在所有处理之后的main
中,你必须释放这样的记忆:
free(val);
问题出在这里:
EstimatedValue myFunction()
{
int myVal = 16; // local variable
EstimatedValue value = &myVal ;
return value; // now release where myVal was
}
当该函数返回其调用者时,保存局部变量myVal
的内存将被释放,并且val
中的EstimatedValue val = myFunction();
本质上指向未被占用的内存空间,即其上任何其他内容都可以被覆盖。然后接下来发生的事情是不可预测的。