-2

我期待下面的代码给出分段错误。由于 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;
}
4

3 回答 3

3

没有取消引用p,而是将其存储的转换为int. 如果你在哪里做:

printf("%d\n",*p++);

然后你会段错误。

于 2013-10-04T10:38:41.097 回答
2

NULL指针不能被取消引用(你不这样做)。

相反,您将指针传递到printf省略号内部,而 printf 认为它正在处理整数,隐式执行不安全的强制转换(因此您的程序也在调用未定义的行为)。

于 2013-10-04T10:40:46.660 回答
1

您的程序具有未定义的行为:++运算符仅允许用于指向有效对象的指针,此外您将指针值传递到printf格式指定的位置int

未定义的行为可能会导致任何结果,即使您的程序似乎可以工作。C 不会对此类代码强加任何编译时间或运行时检查。不要这样做。

于 2013-10-04T12:03:04.730 回答