Ваше magic
число равно 1 475 789 056, что отлично вписывается в 32-разрядное целое число со знаком.
Однако 4 * magic
равно 5 903 156 224, что не происходит, и переполняется!
Технически, целочисленное переполнение со знаком в C - неопределенное поведение, поэтому все, что может произойти в этот момент.Но то, что обычно происходит, так это то, что значение просто усекается до 32 бит, что дает 1 608 188 928, и это количество байтов, которое вы в конечном итоге выделяете для каждого массива.
А затем ваш for
loop, который пытается записать 1,475,789,056 четырехбайтовых целых чисел в этот буфер, запускается из конца массива и, в конечном итоге, вызывает ошибки (возможно, после повреждения некоторых других значений в памяти).
Чтобы исправить этосохраните ваш номер magic
в 64-битной переменной или, по крайней мере, преобразуйте его в 64-битный тип, прежде чем передать его в malloc()
.Я бы порекомендовал использовать size_t
, так как это тип , предназначенный для хранения размеров массивов , а также тип, который malloc()
определен для принятия.
Конечно, в общем, нет гарантии, что size_t
имеет более 32 бит, либо - но если этого не произойдет, то вам все равно не повезло, так как вы используете 32-битные указатели и не будетекогда-либо сможет выделить более 4 ГБ памяти (и, возможно, даже не это) в одном процессе, независимо от того, сколько общего объема оперативной памяти у вас может быть.