C语言是否总是将字符数组中的最后一个元素初始化为零?

3
通过运行这段代码
char array[6];
int i;
for ( i = 0; i < 6; ++i )
    printf("%i ", array[i]);

可能的输出:

64 0 -64 77 67 0

我总是得到最后一个元素0,尽管我期望得到随机值。这是编译器相关的吗?我正在使用gcc。


5
你得到的不是“随机”数,而是“不确定”的数。 - Jabberwocky
2
简单的答案 - 不。 - ryyker
1
好奇心 - 始终是最后一个元素0_。_始终 出现了多少次? - ryyker
3
由于数组的自动存储,很可能是代码中函数之前的部分将该0留在了栈中。 - LPs
2
@Tom 不要再浪费时间在这上面了,如果你想知道在你的情况下到底发生了什么,请使用调试器逐步查看汇编代码。 - Jabberwocky
显示剩余5条评论
3个回答

4

不行。C标准没有保证局部变量的初始化。

未初始化数组的值具有不确定的值。因此,您无法访问它们,如果您这样做,则代码的行为将是未定义的

但是,静态存储期变量(例如全局变量,static限定符变量等)会被初始化为零。


嗯,所以你无法访问它们?那应该是你不应该访问它们吗? - ryyker
1
严格来说,“你不应该访问它们”是最准确的;-) - P.P

3

没有静态存储期(全局变量,static 局部变量)的变量的内容(以及数组的元素)是未定义的。

数组中最后一个元素恰好为0这一事实本质上是随机的。


3
在字符串常量(如"Test"char array[] = "Test";)中,最后一个元素的值为零。在您的示例中,最后一个值是偶然的。
尝试这个:
void f1() // prepare non-zero stack
{
  char array[40];

  memset( array, 32, sizeof array ); 
}

void f2() // your array
{
  char array[6];
  int i;
  for ( i = 0; i < 6; ++i )
    printf("%i ", array[i]);
}

int main()
{
  f1();
  f2();
  return 0;
}

OP包含语句:“我总是得到最后一个元素0”。 如果这是一个准确的观察(而不是夸张),那么“偶然”可能就不准确了。 - ryyker
@ryyker 这只是偶然的。我可以展示如何获取非0值的例子。(在调用这样的函数之前必须填充堆栈。)问题是“C语言是否总是初始化...”,而不是“在我的情况下是否如此”。 - i486
@i486,如果您能展示一下这个例子,我将不胜感激。 - Tom
1
@Tom 请尝试上面回答中的示例。 - i486
@i486 你说得对,现在我不再得到0了,谢谢! - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接