【问题标题】:Does C always initialize the last element in char array to zero? [duplicate]C是否总是将char数组中的最后一个元素初始化为零? [复制]
【发布时间】:2017-03-01 05:13:12
【问题描述】:

通过运行此代码

char array[6];
int i;
for ( i = 0; i < 6; ++i )
    printf("%i ", array[i]);

可能的输出:

64 0 -64 77 67 0

我得到总是最后一个元素 0,虽然我期待随机值。它依赖于编译器吗?我正在使用 gcc。

【问题讨论】:

  • 你得到的不是随机个数字,而是不确定个数字。
  • 简单的答案 - 否
  • 好奇 - 总是最后一个元素 0总是有多少次?
  • 由于你的数组是自动存储的,可能是放代码的函数之前的代码,把那个0留在栈中。

标签: c gcc


【解决方案1】:

没有。对于局部变量,C 标准没有保证这样的事情。

未初始化数组的值有不确定的值。因此,您无法访问它们,而且您的代码具有未定义的行为

但全局变量、static 限定变量等具有静态存储持续时间的变量初始化为零。

【讨论】:

  • 嗯。 ...所以,您无法访问它们...。那应该是...您不应该访问它们...
  • 严格来说你不能访问它们是最准确的;-)
【解决方案2】:

没有静态存储持续时间(全局变量、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 这是偶然的。我可以展示如何获取除 0 以外的值的示例。(在调用此类函数之前必须填充堆栈。)问题是“C 是否总是初始化...”,而不是“在我的情况下是这样的吗”。
    • @i486 我很高兴看到这个例子,你能展示一下吗?
    • @Tom 在上面的答案中尝试示例。
    • @i486 你说得对,现在我不再得到 0,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2015-10-02
    • 2017-05-30
    • 2020-12-03
    • 1970-01-01
    • 2017-06-27
    • 2014-02-06
    相关资源
    最近更新 更多