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

传递同一地址指针作为函数参数的const限定与未定义行为问题

关于带const指针的add函数的两个问题

先看这段特殊的add函数代码,它执行加法和自增操作后把结果存到指定位置:

void add(const int* a, const int* b, int* c) {
    *c = (*a)++ + *b;
}

当我们把同一个指针同时传给参数a和c时:

int a = 1, b = 3;
add(&a, &b, &a);

这会修改指针指向的a的值,现在有两个核心问题:

  1. 这是否违反第一个参数的const限定符?
  2. 该操作是否像典型的未排序操作x = x++一样属于未定义行为?

问题解答

  • 问题1:违反const限定符
    const int* a的语义是:通过该指针不能修改它指向的内容。但函数里的(*a)++直接通过这个const指针修改了指向的值,完全违反了const限定的操作权限规则——哪怕外部传入的是可写变量的地址,函数内部也不能突破const指针的限制去修改目标值。

  • 问题2:属于未定义行为
    这段代码和x = x++是同一类问题:在同一个表达式中,对同一个变量同时进行了读修改((*a)++)和写操作(*c = ...),且两个操作之间没有明确的序列点。根据C语言标准,这种情况下变量的修改顺序未定义,编译器可自由选择执行顺序,最终结果不可预期,完全属于未定义行为。


补充说明

gcc没有给出警告,是因为编译器未做这种跨参数的别名冲突深度检查,但这并不代表代码符合语言标准——从C语言特性本身的角度,上述两个问题的答案都是YES。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:01:01