2014-11-03 5 views
2

я прочитал из книги: «C Primer Plus», который говорит мне, что в стандарте C99, это нормально использовать грамматику, такие как:C: Как сделать размер массива динамическим?

int b=4; 
    char a[b]; 

Но когда я ставлю этот код в vs2013 он говорит мне, что «выражение должно имеют постоянное значение ».

Является ли книга неправильной? Или есть какая-то новая особенность vs2013, о которой я не знал?

+1

'malloc' обычно используется для динамического измерения массива. – squiguy

+8

Visual Studio славится тем, что не поддерживает C должным образом. – Leushenko

+3

VS2013 не является компилятором C. –

ответ

6

Это называется Variable Length Arrays, и я думаю, что ваш компилятор VS2013 их не поддерживает.

Я бы посоветовал вам перейти на другой компилятор. Недавние версии GCC или Clang/LLVM поддерживают VLA, и они поддерживают C99 и даже большинство из C11.

На самом деле я бы даже предложил переключить ваши усилия и систему развития на Linux. Средства разработки обычно составляют free software, как и всю систему.

В противном случае используйте указатель, например. полученные от malloc(3) (или calloc); но затем вы должны проверить распределение на отказ, а затем позвонить free. Избегайте memory leaks (используйте какой-либо инструмент, например valgrind). Возможно, ваш компилятор поддерживает нестандартные, но широко доступные alloca(3). Подумайте, возможно, также используя программный охват a garbage collector, например Boehm's convervative GC: вместо этого вы должны использовать GC_malloc вместо malloc, но вам не нужно звонить GC_free!

+0

Я пытался привыкнуть к затмению в Linux, но просто не могу привыкнуть к нему. И есть некоторые люди, рекомендующие мне редактор vim. Это еще хуже, я даже не знаю, как использовать это – azgt

+0

. Вы можете просто использовать 'emacs' или' gedit' или 'geany' (или многие другие редакторы) под Linux. –

+0

Я просто новичок ... У меня нет понятия, как использовать эти простые редакторы ... Я думаю, что лучше остаться с IDE – azgt

-1

VS2013 не поддерживает объявление переменной длины.

Вы не можете ввести непостоянное значение в скобках, когда вы объявить массив:

char a[b]; 

Поскольку вы получаете размер от пользователя, компилятор не может сказать заранее хау много памяти, необходимой для char array a. Проще всего сделать это (особенно для упражнения) - просто выбрать относительно большую ценность и сделать так, чтобы постоянное распределение, например:

char a [1024];

А затем, если вы хотите быть осторожным (и вы должны), вы можете проверить (b> 1024) и напечатать сообщение об ошибке, если пользователь хочет b, который находится за пределами выделенных границ.

Если вы хотите получить фантазии, вы можете определить char a[] без каких-либо заранее заданного размера, как char *a; а затем передать его позже с таНос:

a = (char *)malloc(sizeof(char) * b); 

вы также должны бесплатно char a[] позже, когда вы «Сделано с ним:

free(a); 

Надеюсь, это поможет!

+0

Я еще не добрался до этой части, но спасибо :) – azgt

+0

@ArcherJohn you не понял? – Blackhat002

+0

Я имею в виду, что я все еще изучаю С прямо сейчас, я еще не прошел эту часть – azgt

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