2013-08-10 2 views
0

Я новичок в C и хочу спросить разницу в процедуре выделения памяти в 2-х различных кодов, указанных ниже:Использование #define в определении размера строки C

#define MAX_LEN 10000 
int main() 
{ 
char str_new[MAX_LEN]; 
... 
} 


int main() 
{ 
char str_new[10000]; 
... 
} 

Являются ли эти два не то же самое по существу ?? Не будет ли выделено память так же в этих двух? На вопросы, которые я искал, на это не ответил. Хотя оба метода использовались часто.

+1

Вы должны понимать различные этапы компиляции. Попытайтесь прочитать несколько вещей на препроцессоре. – Macmade

+0

Да, они одинаковы - перед фактической компиляцией выполняется прямая замена символов, поэтому вы заканчиваете компиляцию одинаковых символов. Остерегайтесь кодирования '#define MAX_LEN = 10000' или' #define MAX_LEN 10000; ', поскольку они включают символы, которые вы не хотите подставлять. –

+1

Кроме того, если вы когда-либо включаете выражение, окружайте его '()'. Например, если вы код '#define MY_CONST 5 + 10', а затем' int x = MY_CONST * 3; ', вы получите' int x = 5 + 10 * 3; 'и результат 35, а не 45. Так code '#define MY_CONST (5 + 10)'. –

ответ

3

Они оба эквивалентны. В первой программе макрос MAX_LEN заменяется на 10000 простой текстовой заменой.

+0

, так как мы можем улучшить распределение памяти при вводе, строку с символами <10000, где пользователь может даже положить 10 символов? – sidPhoenix

+0

@ user2669913 1. Вы запрашиваете у пользователя длину ввода, затем вы назначаете VLA. Или, 2. вы используете достаточно маленький (но достаточно большой) буфер с постоянным размером, получите пользовательский ввод с помощью 'fgets()', а затем добавьте его в конец динамически расширяемого буфера. –

0

Да, оба вышеупомянутых метода будут выделять одинаковый объем памяти для str_new.

Это связано с тем, что распределение статической памяти выполняется во время компиляции, когда директивы препроцессора разрешены во время предварительной обработки.

1

В вашем коде, то же самое. И в компьютерном режиме они всегда одинаковы.

Однако, думаю, если у вас есть

char str_new_o1[10000]; 
char str_new_02[10000]; 
char str_new_03[10000]; 
char str_new_04[10000]; 
char str_new_05[10000]; 
... 

char str_new_100[10000]; 

Даже, может быть, они находятся в разных файлах floders различно.

И все массивы должны иметь одинаковый размер (потому что они имеют одинаковый смысл). хорошо, что они сейчас.

Но, другой день, вы обнаружите, что вам нужно изменить размер массивов, вам нужно 2000 сейчас, так что вам нужно изменить все эти массивы, one forget ,lots errors. Теперь мы называем 1000 в Magic Number.

Хотя, если вы определяете 1000 как marco, вам нужно только один раз изменить, ничего не нужно беспокоиться.

Так, они отличаются по нашему мнению,, если у вас есть только один массив, используйте номер непосредственно, потому что не нужно марко зло, а если у вас есть много одинаковых матриц размера , используйте marco для avod магическое число.

0

В процессе компиляции MAX_LEN в вашей основной функции будет заменен вашим значением #define MAX_LEN, а именно 10000. также, ВСЕ MAX_LEN следует заменить. и я думаю, что #define MAX_LEN больше не будет присутствовать в вашем списке символов после компиляции

0

Они оба одинаковы.

От стандарта:

6,10.3/9 Macro замена

предварительной обработки директивы формы

#define identifier replacement-list new-line 

де фи определяет объект, как макрос, который вызывает каждый последующий экземпляр макроимени быть заменен списком замещения предобработки лексем, которые представляют собой остальная часть директивы.

Это означает, что во время предварительной обработки шага вы компилятор заменит все вхождение MAX_LEN его значение. Итак:

#define MAX_LEN 10000 

char str_new[MAX_LEN]; 

просто переводится в:

char str_new[10000];