Здравствуйте, я задаюсь вопросом, почему это работает с тех пор в учебниках, и поэтому он всегда перечисляет, что массивы должны иметь фиксированный размер, за исключением случаев динамического создания одного с 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?
Заранее спасибо.
Это функция C99, называемая [массив переменной длины] (http://en.wikipedia.org/wiki/Variable-length_array). – Kninnug
На уровне ассемблера это должно сделать что-то вроде регулировки указателя стека по переменной. Вероятно, это делается у входа в блок. Максимум зависит от системы, нет портативного способа узнать заранее, если это будет успешным. Если вы используете длину 0 или меньше, поведение не определено. Обычно это дешевле, чем «malloc» с точки зрения времени и, вероятно, немного дешевле с точки зрения пространства (обычно у вас больше памяти кучи, чем у доступной памяти стека). Связано: GNU 'alloca'. – mafso