【问题标题】:expected segmentation fault while incrementing NULL pointer增加 NULL 指针时预期的分段错误
【发布时间】:2013-10-04 10:36:14
【问题描述】:

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

【问题讨论】:

  • @Joe,错了,阅读也会有这个效果,这里不进行阅读。

标签: c


【解决方案1】:

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

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

那么你会出现段错误。

【讨论】:

  • 他可能会遇到分段错误,但无法保证实际会发生什么。
  • 这段代码没有转换。为期望 int 的说明符传递一个指针具有未定义的行为,而不是隐含的转换。它可能会表现得好像发生了转换,但这并不可靠。
【解决方案2】:

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

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

【讨论】:

  • 只有转换结果不能用整数表示时才定义,否则定义实现。
  • 未定义的行为已经在 ++ 运算符处。这仅适用于指向有效对象的指针。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 2020-10-04
    • 2016-01-02
    • 2019-08-19
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多