Во-первых, вы вызываете неопределенное поведение из-за целочисленного переполнения со знаком. Предполагая, что int
является 32-разрядным, значение 50000 * 50000 выходит за пределы диапазона int
, вызывая переполнение.
Вы можете исправить это, поставив sizeof(float)
первым в выражении. Результатом sizeof
является size_t
, который без знака и, по крайней мере, такой же большой, как int
. Затем, когда каждый n
умножается, он сначала преобразуется в size_t
, что позволяет избежать переполнения.
float *x = malloc(sizeof(float)*n*n);
Однако, даже если вы исправите это, вы просите слишком много памяти.
Если предположить, что sizeof(float)
- это 4 байта, n*n*sizeof(float)
- это около 10 ГБ памяти. Если вы проверите возвращаемое значение malloc
, вы, вероятно, увидите, что оно возвращает NULL.
Вам нужно будет сделать ваш массив намного меньше. Вместо этого попробуйте n=1000
, который будет использовать только около 4 МБ.