[c]中可变长度数组(VLA)的初始值从何而来?

时间:2016-05-08 20:05:17

标签: c variable-length-array

示例c代码:

library("mice")

imp <- mice(nhanes)
fit <- with(imp, table(bmi, hyp))
est <- pool(fit) 

# dimensions
nl <- length(fit$analyses)
nr <- nrow(fit$analyses[[1]])
nc <- ncol(fit$analyses[[1]])

# names
rnames <- rownames(fit$analyses[[1]])
cnames <- colnames(fit$analyses[[1]])

# cast list to array
fit.arr <- array(unlist(fit$analyses), dim=c(nr,nc,nl), 
                 dimnames=list(rnames,cnames))

# get "mean" contingency table
apply(fit.arr, 1:2, mean)

#        1   2
# 20.4 1.8 0.0
# 21.7 1.4 0.0
# 22   1.4 0.2
# 22.5 1.8 0.4
# 22.7 1.2 0.4
# 24.9 1.2 0.0
# 25.5 1.0 1.6
# 26.3 0.0 1.0
# 27.2 0.4 1.0
# 27.4 1.4 0.4
# 27.5 1.6 0.2
# 28.7 0.0 1.0
# 29.6 1.0 0.2
# 30.1 1.8 0.2
# 33.2 1.0 0.0
# 35.3 1.2 0.2

示例输出:

#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 [2,4,6]是唯一再次运行代码时会发生变化的?

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

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

3 个答案:

答案 0 :(得分:2)

这不仅适用于VLA;上面的行为是针对任何变量声明的。如果声明变量,例如

int a;

这将在堆栈上分配sizeof(int)个字节,无论系统选择哪个地址。那里的记忆是 uninitalized ;它是当时正在发生的事情。程序员可以初始化内存。

答案 1 :(得分:2)

Online C 2011 standard,6.7.9 / 10:&#34;如果具有自动存储持续时间的对象未明确初始化,则其值不确定...&#34;

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

<小时/>

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

答案 2 :(得分:0)

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

你的程序只是对操作系统说:“给我一部分内存”,操作系统会这样做,把它交给你的程序而不改变内容