【问题标题】:From where do the initial values of the variable length array (VLA) in [c] come?[c] 中的可变长度数组(VLA)的初始值从哪里来?
【发布时间】:2016-09-03 09:50:46
【问题描述】:

示例c代码:

#include <stdio.h>
int main (int argc, char** args) {

    int k = 8;
    int sendbuffer[k]; // VLA

    for (int n = 0; n < k; n++) {
        printf("sendbuffer[%i]: %i \n", n, sendbuffer[n]);
    }

    return 0;
}

示例输出:

sendbuffer[0]: 1 
sendbuffer[1]: 0 
sendbuffer[2]: 1583871280 
sendbuffer[3]: 32767 
sendbuffer[4]: 22544384 
sendbuffer[5]: 1 
sendbuffer[6]: 1713234504 
sendbuffer[7]: 32767 

sendbuffer[] 中的数字是从哪里来的? 为什么再次运行代码时只有 sendbuffer[2,4,6] 会发生变化?

我在 OSX El Capitan 上使用 clang 编译器(使用 gcc example.c 编译)
Apple LLVM 版本 7.3.0 (clang-703.0.31)
目标:x86_64-apple-darwin15.4.0
线程模型:posix

如果与其他编译器/操作系统有不同的行为,我也想听听这些情况。

【问题讨论】:

  • 未定义的行为。这些值是内存中发生的任何内容。
  • 这不是 VLA 特有的。

标签: c variable-length-array


【解决方案1】:

这不仅仅适用于 VLA;上述行为适用于任何变量声明。如果你声明一个变量,例如

int a;

这会在堆栈上分配sizeof(int) 字节,无论系统选择哪个地址。那里的内存未初始化;这就是当时发生的任何事情。由程序员来初始化内存。

【讨论】:

    【解决方案2】:

    Online C 2011 standard, 6.7.9/10: "如果一个具有自动存储持续时间的对象没有被显式初始化,它的值是不确定的......"

    除非您在文件范围内声明它或使用static 关键字1,否则变量不会被初始化为任何特定值;内容将是最后写入该内存位置的任何内容。


    1. 这两者都不适用于 VLA;它们不能被声明为static 或在文件范围内,也不能有明确的初始化程序。

    【讨论】:

      【解决方案3】:

      这些值称为垃圾值,它们是创建数组时内存中的任何值,解释为ints。

      您的程序只是对操作系统说:“请给我那部分内存”,操作系统也会这样做,将其提供给您的程序而不更改内容

      【讨论】:

        猜你喜欢
        • 2012-12-14
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 2020-04-12
        • 2013-06-24
        • 2016-11-26
        • 2013-09-22
        • 2021-07-11
        相关资源
        最近更新 更多