В Java массив размещается на куче.Если распределение завершается неудачно, выдается исключение с перехватом!Возможно восстановление после неудачного выделения массива.
% java Main
enter a number:
1231231231
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Main.main(Main.java:12)
Перехватите исключение:
try {
int[] arr = new int[size];
} catch (OutOfMemoryError e) {
System.out.println("Alas, such array could not be allocated. Try a smaller number next time!");
}
, и вы получите
% java Main
enter a number:
1231231231
Alas, such array could not be allocated. Try a smaller number next time!
Причина, по которойпростое использование массивов переменной длины в C99 часто вызывает недовольство тем, что массив размещается в stack .Теперь, если размер массива исходит от пользователя, легко вызвать неуправляемый сбой:
#include <stdio.h>
int main(void) {
int size;
scanf("%d", &size);
volatile int arr[size];
printf("%d\n", arr[size - 1]);
}
, теперь скомпилируйте и запустите:
% ./a.out
1231231231
zsh: segmentation fault (core dumped) ./a.out
Есть невозможно проверить, было ли выделение выполнено успешно или нет.Поэтому, если вы не уверены - и особенно когда играете с числами, которые могут быть получены от ненадежного пользователя, вы не должны использовать выделенные стеком массивы переменной длины.