Интерфейс FFI не знает о типе вашего указателя, поэтому он просто обрабатывает его как байтовый массив (см. Initialize для типа указателя). Обратите внимание, что в то время как вы передаете :int
, это относится к конкретным write
и read
, а не к тому месту, где вы выполняете индексацию. Таким образом, вы пишете и печатаете с байтовыми смещениями 0,1,2,3, а не с целочисленными элементами 0,4,8,12.
В системе с прямым порядком байтов, с 32-битным 4-байтовым int двоичное значение 20 равно 14 00 00 00
, а 16 - 10 00 00 00
.
Таким образом, вы выделяете 4 * 4 байта, то есть 32 байта, первые 8 -.
00 00 00 00 00 00 00 00
И написать 20 со смещением 0
14 00 00 00 00 00 00 00
А затем написать 16 со смещением 1
14 10 00 00 00 00 00 00
14 10 00 00
равен 0x00001014
или 4116, а затем при следующем смещении, которое вы печатаете, это 10 00 00 00
, что равно 16.