Смотря что именно подразумевается под "создать массив" )) Вот хорошая шпаргалка на тему, что это может означать и где он в результате окажется:
int arr1[100000]; // BSS
vector<int> arr2; // HEAP
struct DumbStruct {
int someArr[10000];
};
int main () {
int arr3[100000]; // STACK
vector<int> arr4; // HEAP
int* arr5 = new int[100000]; // HEAP
int* arr6 = (int*) malloc(100000 * sizeof(int)); // HEAP
static int arr7[100000]; // BSS
DumbStruct struct; // STACK
DumbStruct* struct2 = new DumbStruct(); // HEAP
vector<DumbStruct> structarr; // HEAP
int n;
scanf("%d", &n);
int arr8[n]; // STACK (assuming C99 -- this does not compile in C++)
}
Если речь именно о динамическом выделении памяти и именно о С++, то есть два варианта: malloc()/free() и new[]/delete[]. Теоретически в случае фрагментации памяти (когда ее, в принципе, достаточно, но не "одним куском") ни тот, ни другой не "заполнит" никаких "свободных" ячеек. malloc() вернет NULL, a new[] кинет std::bad_alloc.
А практически, конечно, возможно, что угодно... т.к. 1. new - это оператор, и значит, его можно переопределить, 2. с помошью std::set_new_handler ему можно подсунуть свой аллокатор, а также 3. полезет ли new[] вообще к malloc(), строго говоря, не гарантируется и, наконец 4. реализация malloc(), вообще-то, зависит от ОС, а они нынче умные и могут прореагировать как угодно - вплоть до убийства затребовавшего память процесса OOM менеджером.
Так что, наиболее точный ответ на вопрос: возможны варианты (хорошие и разные)... Однако, если суть вопроса в том, а не получится ли при этом случайно массив, который не массив, то ответ - нет, не получится. Массив, это семантическая конструкция языка. В С++ программист может полагаться на то, что память в массиве непрерывна.