В чем преимущество использования malloc (кроме NULL-возврата при сбое) перед статическими массивами? Следующая программа съест весь мой оперативный памяти и начнет заполнять своп, только если петли не закомментированы. Не вылетает.
...
#include <stdio.h>
unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];
int main (int argc, char **argv) {
int i;
/* for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/* for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */
getchar();
return 0;
}
...
После некоторых проб и ошибок я обнаружил, что приведенный выше самый большой статический массив разрешен на моей 32-битной машине Intel с GCC 4.3. Это стандартное ограничение, ограничение компилятора или ограничение компьютера? Видимо, я могу иметь столько их, сколько захочу. Это приведет к ошибке, но только если я попрошу (и попробую использовать) больше, чем даст мне malloc.
Есть ли способ определить, был ли статический массив фактически выделен и безопасен для использования?
РЕДАКТИРОВАТЬ: Меня интересует, почему malloc используется для управления кучей, а не позволяет системе виртуальной памяти обрабатывать ее. Очевидно, я могу увеличить размер массива во много раз по размеру, который мне понадобится, и система виртуальной памяти будет хранить в памяти только то, что нужно. Если я никогда не напишу, например, конец (или начало) этих огромных массивов, тогда программа не использует физическую память. Кроме того, если я могу записывать в каждое местоположение, то что делает malloc, кроме увеличения указателя в куче или поиска предыдущих выделений в том же процессе?
Примечание редактора: 1 << 31
вызывает неопределенное поведение , если int 32-битный, поэтому я изменил вопрос следующим образом: 1u
. Цель этого вопроса - спросить о выделении больших статических буферов.