You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

*num++引发异常行为:指针操作与变量递增异常原因咨询

指针操作异常的原因分析

先看你的代码:

// num = 3
void test(int *num) {
    printf("Num = %d\n", *num); // "Num = 3"
    
    *num++;
    int x = *num;

    x++;    // 无效果
    x += 1; // 同样无效果

    printf("Num = %d\n", *num); // "Num = 0"
    printf("x = %d\n", x); // "x = 0"
}

int main() {
    int num = 3;
    test(&num);
    return 0;
}

核心问题:运算符优先级导致指针越界

C语言中,后缀++的优先级高于解引用*,所以*num++等价于*(num++),执行逻辑和你预期的完全不同:

  1. 先记录指针num当前的地址(也就是main函数里num变量的地址)
  2. 将指针num本身向后偏移一个int的长度(此时指针指向了栈上未初始化的内存区域,属于非法的越界访问)
  3. 对最初记录的地址进行解引用(这个结果没有被使用,所以main里的num变量值根本没被修改)

为什么*num变成0

执行*num++后,指针已经越界,此时*num读取的是栈上未初始化的随机内存值,你的测试中刚好是0,换个运行环境可能会得到其他随机数——并不是把原来的变量设为0。

关于x递增的误解

x++和x +=1是完全有效的操作,你看到的x=0是错误的:实际执行时,x会先被赋值为越界内存的随机值(比如0),经过两次递增后,x的值应该是2。你代码里的注释可能是写错了,或者运行时出现了特殊的栈内存情况。

正确的写法

如果你想递增指针指向的变量,需要用括号改变优先级,或者直接用加法赋值:

  • (*num)++:先解引用得到变量,再对变量执行递增
  • *num +=1:直接对指针指向的变量加1,写法更直观

内容的提问来源于stack exchange,提问作者CyanCoding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:25:20