определить массив, используя значение типа int из функции в c - PullRequest
1 голос
/ 19 марта 2019

Я хочу сделать мой массив более гибким.Мой вклад приходит из файла.Я получаю информацию о том, насколько большим должен быть мой массив из функции.

Мой кодовый пример выглядит так:

int albumsize = getAlbumnumberFromFile(inputFile);
struct Album Alben[albumsize];

Теперь у меня возникла следующая проблема ... Я не могу сделать что-то подобное.Моя IDE (Visual Studio 2017) говорит об этой ошибке:

выражение должно иметь постоянное значение

Спасибо, Алекс

Ответы [ 3 ]

2 голосов
/ 19 марта 2019

Хотя стандарт C допускает использование массивов переменной длины (VLA), компиляторы Visual Studio не полностью совместимы со стандартами (релевантно Q & A ).

Однако я бы не рекомендовал использовать VLA в этомситуации, даже если они были поддержаны, потому что достаточно большое значение albumsize может привести к неопределенному поведению.

Лучшим подходом является динамическое выделение памяти, например:

struct Album *Alben = malloc(albumsize * sizeof(*Alben));
... // Use the allocated memory here. Once you are done, free it.
free(Alben);

Обратите внимание, что один важныйразница между Alben -the-pointer и Alben -the-array состоит в том, что вы получаете от sizeof: массив сообщает о размере своих данных, а указатель сообщает о размере только одного указателя.По этой причине вам необходимо сохранить значение albumsize, например, для итерации массива в цикле.

0 голосов
/ 19 марта 2019

MSVC не является компилятором Си.Это компилятор C ++ с некоторой совместимостью с Си.Насколько я знаю, Microsoft не предоставляет чистый компилятор C.

Поскольку VLA (массивы переменной длины) не являются частью стандарта C ++, они являются частью стандарта C (и даже необязательного), MSVC решила неподдержать их.Вам придется использовать динамическое выделение памяти для вашего массива, что, я признаю, не очень удобно.

0 голосов
/ 19 марта 2019

Microsoft не поддерживает дистанционно современные стандарты Си. Массивы переменной длины были введены в C99, но MSVC все еще застрял на C89. Вам нужно будет либо просто создать массив статического размера, достаточно большой, чтобы вместить все, что вам может понадобиться, либо создать массив соответствующего размера.

...