int n;
scanf("\n%d ",&n);
int arr[n];
, где n
- это значение c динамического исполнения (как в данном случае), которое не поддерживалось в более старых версиях C, для которых требовалось, чтобы n
была целочисленной константой expression.
Современные версии C сняли это ограничение, разрешив использовать динамически изменяемые массивы (массивы переменной длины или VLA), но в отличие от старых массивов фиксированного размера, VLA имеют ограничения.
Им не разрешено перепрыгивать (с break
/ continue
/ goto
), они могут быть не асин c -signal-safe, они взломают sh вашу программу, если получат слишком большой, и они часто генерируют больший код, чем обычные старые локальные массивы.
Кроме того, поскольку они локальные, вы не можете вернуть указатель на них вызывающей стороне.
ограничение размера является одним из их самых больших ограничений. VLA вырезаны из стека вызовов, который обычно составляет всего пару килограмм / мегабайт, и вы получите обычно невыявленный cra sh, если вы превысите этот предел.
malloc
'd память не имеет такого ограничения, malloc
сбои четко передаются через возвращенный NULL
, и, поскольку malloc
память является глобальной для процесса, вы можете передать указатель на нее обратно своему вызывающему.
`