有人可以解释这个 C 程序的行为吗?

Can someone explain the behavior of this C program?

我正在使用 Ubuntu 和 gcc 进行编译。

#include<stdio.h>
void main()
{
  char *c =0 ;
  while(1)
   {
     printf("%p",c);
     c++;
    // printf("%c",*c); // behavior after un-commenting this line is strange.
   }
}

当我执行这段代码时,它开始打印大量地址,这完全没问题。但是当我取消注释 printf("%c",*c) 时,代码甚至不打印第一个地址 并产生分段错误。 我知道分段错误是什么,我故意写了这段代码但我期待它会在分段错误之前打印几个地址(至少第一个地址)但它只是终止而没有打印任何东西

增加指向 NULL 的指针会调用未定义的行为。

C11:6.5.6 加法运算符(第 8 页):

If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

因为 c 没有指向数组。

未定义的行为

  1. 您似乎意识到您编写的代码由于取消引用而损坏。
  2. 您似乎没有意识到 %p 需要一个空指针。因此,请确保将 c 投射到那个。

行缓冲

大多数控制台都会对输出进行行缓冲。所以尝试使用:

printf("%p\n", (void *) c);

或使用

显式刷新输出
fflush(stdout);