增加NULL指针时预期的分段错误

时间:2013-10-04 10:36:14

标签: c

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

3 个答案:

答案 0 :(得分:3)

取消p,您将其存储的转换为int。如果你在做什么:

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

然后你会出错。

答案 1 :(得分:2)

NULL指针无法解除引用(您不会这样做)。

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

答案 2 :(得分:1)

您的程序有未定义的行为:++运算符仅允许指向有效对象的指针,此外您将指针值传递给printf,其中格式指定int

未定义的行为可能会产生任何结果,即使您的程序似乎有效。 C不会对此类代码进行任何编译时或运行时检查。不要这样做。