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

C语言中针对NULL指针的算术运算是否有明确定义?

C语言中NULL指针算术运算的定义性行为分析

代码示例1的分析

void foo(void)
{
    int *a = NULL;
    a += 4;
    printf("%p\n", (void *)a);
}

该操作属于未定义行为。C标准规定,指针加法、减法这类算术运算仅适用于指向数组元素的指针,或者指向数组末尾之后一个合法位置的指针。NULL指针不指向任何有效的数组或对象,对它执行+= 4这样的偏移操作没有标准定义的语义,编译器可任意处理该操作——可能输出不符合预期的地址,也可能导致程序崩溃。

代码示例2的分析

void foo(void)
{
    int *a = NULL;
    int *v = a;
    printf("%td\n", v - a);
}

该操作属于定义行为。C标准明确规定,当两个指针相等时(此处v和a均为NULL,属于相等的指针),它们的差值为ptrdiff_t类型的0。因此这段代码的行为是确定的,会输出0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:02:07