我期待以下代码给出分段错误。由于NULL指针指向任何东西,增加指向任何东西的东西是没有意义的。 但它的印刷0,4,8,12,16。
#include<stdio.h>
int main()
{
int *p ,i=0;
p = NULL;
for(i=0;i<5; i++) {
printf("%d\n",p++);
}
return 0;
}
答案 0 :(得分:3)
您不取消p
,您将其存储的值转换为int
。如果你在做什么:
printf("%d\n",*p++);
然后你会出错。
答案 1 :(得分:2)
NULL
指针无法解除引用(您不会这样做)。
相反,您将指针传递给省略号内的printf
,而printf认为它正在处理整数,隐式执行不安全的转换(因此您的程序也调用未定义的行为)。
答案 2 :(得分:1)
您的程序有未定义的行为:++
运算符仅允许指向有效对象的指针,此外您将指针值传递给printf
,其中格式指定int
未定义的行为可能会产生任何结果,即使您的程序似乎有效。 C不会对此类代码进行任何编译时或运行时检查。不要这样做。