我是大会的初学者,我很难让sbrk以我想要的方式分配内存。我最终想要创建一个2D数组,首先分配一列,然后遍历每一行,一次分配一行。但是,我注意到当我第二次使用sbrk时,它不会从未使用的内存位置开始,而是覆盖我已经分配的内存地址。因此,为了找出我做错了什么,我现在决定使用一维数组。
当我第一次使用
时li $a0, 3 # array of length 3
li $v0, 9
syscall
它分配内存块0x10040000
。然后我将3个整数输入到我分配的三个位置。在那之后,我做另一个sbrk只是为了看看它从哪个地址开始。当我这样做时,它分配0x10040004
,覆盖我输入的一个整数。以下是我使用的代码。
# test with 1D array
# $s0 => length of array
# $s1 => address of first element in array
# $s2 => address of second sbrk
li $s0, 3
move $a0, $s0
li $v0, 9
syscall
move $s1, $v0
# use $t1 to go through array
move $t1, $s1
# read first int
li $v0, 5
syscall
sw $v0, ($t1)
addi $t1, $t1, 4
# read second int
li $v0, 5
syscall
sw $v0, ($t1)
addi $t1, $t1, 4
# read third int
li $v0, 5
syscall
sw $v0, ($t1)
# use sbrk for second time
li $a0, 5
li $v0, 9
syscall
move $s2, $v0
# exit
li $v0, 10
syscall
此计划完成后,$s1 = 0x10040000
和$s2 = 0x10040004
。
为什么sbrk从已经分配的位置开始分配内存?有没有办法告诉它从特定地址开始?如果我做了一些没有意义的事情,请纠正我。
答案 0 :(得分:1)
您应该传递sbrk
的单位是字节。 3个整数是3 * sizeof(int)
或(在大多数架构上)12。