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
相关产品推荐
相关产品推荐

