2010-05-10 3 views
6

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

01 int bound = bound*4; 

02 static GLubyte vertsArray[bound]; 

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

Любые идеи, почему я получаю эту ошибку? спасибо много,

ответ

5

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

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

11

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

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

3

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

-3

использовать любой из этих

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

GLubyte* vertsArray = new GLubyte[bound]; 

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

delete [] vertsArray; 

free((void*)vertsArray; 

Несмотря на то, что они говорят в комментариях, я до сих пор говорят, что вы должны отдавать предпочтение вместо malloc если вы не на 100% вынуждены использовать C. См. Это link for more information

+2

Неправильный язык - это вопрос C. :) – Arafangion

+0

Я, хотя malloc и свободный подход были для C, и по этой причине я сказал, предпочитаю использовать new/delete, только если поддерживается ... –

+6

Если ваш компилятор поддерживает 'new' /' delete', это C++ компилятор, а не компилятор C. И вы действительно не должны использовать компилятор C++ для компиляции кода C по ряду причин. Вы не должны поощрять кого-либо использовать C для использования C++ «если их компилятор поддерживает его». –

Смежные вопросы