2014-09-20 3 views
0

Здравствуйте, я задаюсь вопросом, почему это работает с тех пор в учебниках, и поэтому он всегда перечисляет, что массивы должны иметь фиксированный размер, за исключением случаев динамического создания одного с malloc.C (динамический) массив (фиксированный размер)

#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char **argv) { 
     if(argc < 2) 
     return 0; 

     int tmp[ atoi(argv[1]) ]; 


     printf("sizeof tmp equals to %d\n", sizeof tmp); 
     return 0; 
} 

Что происходит в фоновом режиме на уровне ASM при выполнении этого? И как это работает? Распределяет ли он размер, указанный при запуске программы в стеке и каков максимальный размер для стека?

Кроме того, это больше памяти дороже, чем использование malloc?

Заранее спасибо.

+1

Это функция C99, называемая [массив переменной длины] (http://en.wikipedia.org/wiki/Variable-length_array). – Kninnug

+0

На уровне ассемблера это должно сделать что-то вроде регулировки указателя стека по переменной. Вероятно, это делается у входа в блок. Максимум зависит от системы, нет портативного способа узнать заранее, если это будет успешным. Если вы используете длину 0 или меньше, поведение не определено. Обычно это дешевле, чем «malloc» с точки зрения времени и, вероятно, немного дешевле с точки зрения пространства (обычно у вас больше памяти кучи, чем у доступной памяти стека). Связано: GNU 'alloca'. – mafso

ответ

0

В C99 представлены variable length array, длина которых не является постоянным выражением. Декларация

int tmp[ atoi(argv[1]) ]; 

объявляет tmp, как VLA.

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