从void * [duplicate]转换时整数值损坏

问题描述 投票:-1回答:2

我有以下代码:

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它可以正常工作。这种行为可能是什么原因?可以做些什么来避免这种行为

c typedef void-pointers
2个回答
1
投票

myVal是在myFunction函数的堆栈中创建的。而你正在返回一个地址。这会导致未定义的行为,因为myVal的值一旦超出范围就会改变。

你可以做的是为这样的值创建内存:

EstimatedValue value = malloc(sizeof(int);

分配值:

*value = 16;
return value;

在所有处理之后的main中,你必须释放这样的记忆:

  free(val);

1
投票

问题出在这里:

EstimatedValue myFunction()
{
    int myVal = 16;                  // local variable
    EstimatedValue value = &myVal ;
    return value;                    // now release where myVal was
}

当该函数返回其调用者时,保存局部变量myVal的内存将被释放,并且val中的EstimatedValue val = myFunction();本质上指向未被占用的内存空间,即其上任何其他内容都可以被覆盖。然后接下来发生的事情是不可预测的。

© www.soinside.com 2019 - 2024. All rights reserved.