C中奇怪的指针问题

时间:2015-07-06 11:19:46

标签: c pointers

我有以下代码:

#define MIN(a,b) (a <= b ? a : b)
void main()
{
    int a = 5;
    int* p = &a;
    int result = MIN(*p++,12);
    printf("%i",result);
}

理论上,输出应该小于12,但结果是34。所以我想知道内联函数或指针有什么问题吗?

顺便说一句,我的意思是*p++而不是(*p)++。我知道它会增加地址并取消装箱。

所以另一个问题通常是下一个地址的价值是什么?在这种情况下,*p++的价值是什么?

1 个答案:

答案 0 :(得分:3)

这一行:

int result = MIN(*p++,12);

扩展为:

int result = (*p++ <= 12 ? *p++ : 12);
              ^^^^         ^^^^

所以p增加两次,返回的值是垃圾(注意这实际上是未定义的行为)。

这就是为什么强烈建议不要使用这些宏 - 你真的不想要这样令人讨厌的副作用。

使用正确的内联函数而不是宏:

inline int MIN(int a, int b)
{
    return a <= b ? a : b;
}