The auto memory (used in local arrays) has a limit well below the allocatable memory.
You can do practically the same with this (it uses pointers)
#include
int main(int argc, const char *argv[])
{
unsigned long long lim = 2000000;
unsigned long long *nums2lim=malloc(lim*sizeof(unsigned long long));
free(nums2lim); // don't forget this!
return EXIT_SUCCESS;
}