从 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,即任何其他内容都可以被覆盖。那么接下来的事情就不可预测了。