1

在编写以下代码时,我应该得到一个错误。数组大小为零(我认为这是非法的),此外 sprintf 正在将“abc”打印到尚未分配任何内存但我得到的输出为“abc”。我不明白为什么?

#include<stdio.h>
#include<string.h>
int main()
  {
    char a[0];
    sprintf(a,"%s","abc");
    printf("%s\n",a);
    return 0;
  }

当我将数组大小设置为 1、2、3 时,我得到了正确的输出,而当显式使用 a 作为指针,即使用 char *a( 这是预期的)。有人可以解释内部工作吗?

4

1 回答 1

4

不,没有合理的解释。通过使用小于要打印的字符串的数组,您的程序会调用未定义的行为。这意味着实际上任何事情都可能发生,包括一切似乎都运行良好的事实。未定义的行为并不意味着程序必须崩溃,而是意味着它可能会崩溃。

于 2013-03-17T13:25:16.837 回答