Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C99可变长度数组Wikipedia示例_C_Arrays_C99 - Fatal编程技术网

C99可变长度数组Wikipedia示例

C99可变长度数组Wikipedia示例,c,arrays,c99,C,Arrays,C99,我在Wikipedia上遇到了C99可变长度数组的示例: float read_and_process(int n) { float vals[n]; for (int i = 0; i < n; i++) vals[i] = read_val(); return process(vals, n); } 浮点读取和浮点处理(int n) { 浮动VAL[n]; 对于(int i=0;i

我在Wikipedia上遇到了C99可变长度数组的示例:

float read_and_process(int n)
{
    float vals[n];

    for (int i = 0; i < n; i++)
        vals[i] = read_val();
    return process(vals, n);
}
浮点读取和浮点处理(int n)
{
浮动VAL[n];
对于(int i=0;i

这是不对的吗?我的印象是变长数组仍然只是指针,这意味着上面的代码正在将过期的指针VAL传递给进程(…)函数。

指针尚未过期。它是指向有效内存的指针,直到函数read_和_进程结束。这意味着在调用流程时它仍然被定义

这是一个无效使用的示例:

float read_and_process(int n)
{
    float vals[n];

    for (int i = 0; i < n; i++)
        vals[i] = read_val();
    return vals;
}
浮点读取和浮点处理(int n)
{
浮动VAL[n];
对于(int i=0;i
不要忘记,当执行
process()
时,包含所有
read\u和\u process()
自动变量(包括
float vals[n]
)的堆栈帧仍然有效,并且在内存中。

数组不是指针。它们只是衰减为指针——有些人会说,令人烦恼的是,+1表示“数组不是指针”。另见《Oh ok》第6节,这很有意义。只要你在增加堆栈,内存地址就必须仍然有效。@杰夫:更好的方法是:数组(或任何本地非
静态对象)继续存在,直到创建它的函数返回为止。(实际上它与封闭块绑定,但在本例中是相同的。)本地对象的生存期是执行期间的一段时间,而不是程序文本的一个区域。调用
进程
不会终止执行
读取和\u进程
,因此数组仍然存在。