动态内存分配和sprintf

时间:2013-03-17 13:23:33

标签: c

在编写以下代码时,我应该收到错误。数组大小为零(我认为这是非法的),而且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(这是预期的)。有人可以解释内部工作吗?

1 个答案:

答案 0 :(得分:4)

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