Может ли массив быть статически размещен, если мы не знаем длину массива во время компиляции в c99? - PullRequest
0 голосов
/ 31 октября 2019

Я не уверен, что это правильно, я включил пример того, что я имею в виду:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv){
    int duzina;
    duzina = strlen(argv[1]);

    char novi[duzina+1];
    strcpy(novi, argv[1]);
    printf("%s\n", novi);

    return 0;
}

Я скомпилировал и запустил его, и он выполнялся, как предполагалось, но я не уверен, если этоправильное использование статического распределения.

Ответы [ 2 ]

4 голосов
/ 31 октября 2019

Массив novi в вашем коде имеет длительность автоматического хранения и без связи . Он не "статически распределен". Это массив переменной длины , поскольку его длина была определена во время выполнения.

Длина массива с статической продолжительностью хранения определяется во время компиляции и не можетизменяться во время выполнения.

Единственное, что не так с вашим кодом, это то, что он не проверяет количество аргументов командной строки, поэтому argv[1] может быть нулевым указателем [*], а strlen(argv[1]); будетзатем вызвать неопределенное поведение .


[*] Технически, argv[1] может быть даже за пределами массива argv. Существуют только элементы до argv[argc], причем argv[argc] является нулевым указателем. Возможно, хотя и маловероятно, что argc может быть 0, хотя большая часть кода предполагает argc > 0.

1 голос
/ 31 октября 2019

Нет никаких проблем с этим.

На самом деле вы не статически выделяете память (ключевое слово static в области видимости файла вне функции не является обязательным, но это не так. в объеме функции, внутри функции). Вместо этого вы автоматически выделяете память :

Автоматическое выделение памяти происходит для (нестатических) переменных, определенных внутри функций , и обычно хранится в стеке(хотя стандарт C не требует использования стека). Вам не нужно резервировать дополнительную память, используя их, но, с другой стороны, вы также имеете ограниченный контроль над временем жизни этой памяти. Например: автоматические переменные в функции существуют только до ее завершения.

См. Также Разница между статическим выделением памяти и динамическим выделением памяти

Единственное ограничениев вашем коде вы не сможете изменить размер массива, используя realloc(), но это прекрасно, если вам не нужно.

...