C99 Пример массива переменной длины в Википедии - PullRequest
2 голосов
/ 29 декабря 2011

Я встречал этот пример массивов 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 (...).

Ответы [ 2 ]

6 голосов
/ 29 декабря 2011

Указатель не истек.Это указатель на действительную память до конца функции 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 голос
/ 29 декабря 2011

Не забывайте, что кадр стека, содержащий все автоматические переменные read_and_process(), включая float vals[n], все еще действует и находится в памяти при выполнении process().

...