我期待下面的代码给出分段错误。由于 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;
}
我期待下面的代码给出分段错误。由于 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;
}
您没有取消引用p
,而是将其存储的值转换为int
. 如果你在哪里做:
printf("%d\n",*p++);
然后你会段错误。
NULL
指针不能被取消引用(你不这样做)。
相反,您将指针传递到printf
省略号内部,而 printf 认为它正在处理整数,隐式执行不安全的强制转换(因此您的程序也在调用未定义的行为)。
您的程序具有未定义的行为:++
运算符仅允许用于指向有效对象的指针,此外您将指针值传递到printf
格式指定的位置int
。
未定义的行为可能会导致任何结果,即使您的程序似乎可以工作。C 不会对此类代码强加任何编译时间或运行时检查。不要这样做。