c массивами: установка размера динамически? - PullRequest
6 голосов
/ 10 мая 2010

Я новичок в программировании на C. Я пытаюсь установить размер массива с помощью переменной, но получаю сообщение об ошибке: Размер хранилища «массива» не является постоянным !!

01 int bound = bound*4;

02 static GLubyte vertsArray[bound];

Я заметил, что когда я заменяю bounds (в скобках в строке 02) на число, скажем «20», программа запускается без проблем. Но я пытаюсь установить размер массива динамически ...

Есть идеи, почему я получаю эту ошибку? большое спасибо,

Ответы [ 4 ]

11 голосов
/ 10 мая 2010

Вы получаете эту ошибку, потому что, как сказал вам компилятор, размер вашего массива не постоянен. В C89 / 90 версии языка C размер массива должен быть постоянным. Вы не можете «установить размер массива динамически». Если вам нужен массив размера во время выполнения, вам нужно либо выделить его вручную с помощью malloc, либо использовать какой-то нестандартный подход, специфичный для компилятора (например, функция alloca).

В C99 версии языка C была добавлена ​​поддержка так называемых массивов переменной длины (VLA). Компилятор C99 будет принимать объявление массива размера во время выполнения для автоматического массива. Но даже в C99 вы не можете объявить статический массив размера времени выполнения, как вы пытаетесь.

5 голосов
/ 10 мая 2010

Чтобы создать массив непостоянного размера (т. Е. Известный во время компиляции), вам нужно динамически выделить для него пространство, используя malloc() (и соответственно освободить его, используя free(), когда он больше не требуется).

Как отмечали другие, возможность объявлять динамические массивы доступна в компиляторах, совместимых с C99.

3 голосов
/ 10 мая 2010

То, что вы хотите, возможно в C99; однако в более ранних версиях C вы застреваете при вызове функций для динамического выделения памяти, например alloca(3) или malloc(3).

0 голосов
/ 10 мая 2010

используйте любой из этих

GLubyte* vertsArray = (GLubyte*) malloc(sizeof(GLubyte) * bound);

GLubyte* vertsArray = new GLubyte[bound];

не забудьте освободить память, когда вам больше не нужен объект

delete [] vertsArray;

free((void*)vertsArray;

Несмотря на то, что они говорят в комментариях, я все же говорю, что вы должны предпочесть new вместо malloc , если вы не на 100% вынуждены использовать C. Смотрите эту ссылку для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...