从 void * 转换时整数值损坏
Integer value corrupt when casting from void*
我有以下代码:
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)。
如果我尝试在 main
函数中访问 *(int*)val
它工作正常。这种行为的原因可能是什么?
可以做什么来避免这种行为
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
in EstimatedValue val = myFunction();
本质上是指向一个未被占用的内存 space,即任何其他内容都可以被覆盖。那么接下来的事情就不可预测了。
我有以下代码:
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)。
如果我尝试在 main
函数中访问 *(int*)val
它工作正常。这种行为的原因可能是什么?
可以做什么来避免这种行为
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
in EstimatedValue val = myFunction();
本质上是指向一个未被占用的内存 space,即任何其他内容都可以被覆盖。那么接下来的事情就不可预测了。