我在维基百科上看到了这个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);
}
这是不正确的?我的印象是变长数组仍然只是指针,这意味着上面的代码将过期的指针值传递给process(...)函数。
答案 0 :(得分:6)
指针尚未过期。它是指向有效内存的指针,直到函数read_and_process结束。这意味着在调用流程时仍然会定义它。
这将是无效使用的示例:
float read_and_process(int n)
{
float vals[n];
for (int i = 0; i < n; i++)
vals[i] = read_val();
return vals;
}
答案 1 :(得分:1)
不要忘记包含所有read_and_process()
自动变量(包括float vals[n]
)的堆栈帧仍然有效,并且在执行process()
时在内存中。