Memory 程序集x86-64二维数组,每行后面都有额外地址

Memory 程序集x86-64二维数组,每行后面都有额外地址,memory,assembly,multidimensional-array,Memory,Assembly,Multidimensional Array,我正在使用x86-64汇编并使用-m32标志进行编译。代码在第一个参数中发送,该参数是指向多维int数组板[width][height]的双指针,第二个参数是width,最后一个参数是height。当我在gdb中运行它来检查每一行之后的内存地址时,它应该继续到下一行,值中有一个“25”,下一个地址继续到下一行。那么什么时候应该把它解读为 1 2 3 4 5 6 7 8 9 记忆看起来像 1 2 3 25 4 5 6 25 7 8 9 .file "xxxxxx.c" .text .gl

我正在使用x86-64汇编并使用-m32标志进行编译。代码在第一个参数中发送,该参数是指向多维int数组板[width][height]的双指针,第二个参数是width,最后一个参数是height。当我在gdb中运行它来检查每一行之后的内存地址时,它应该继续到下一行,值中有一个“25”,下一个地址继续到下一行。那么什么时候应该把它解读为

1 2 3
4 5 6
7 8 9
记忆看起来像

1 2 3 25
4 5 6 25
7 8 9 
.file   "xxxxxx.c"
.text
.globl update
.type   update, @function
update:

pushl %ebp
movl %esp, %ebp

movl 8(%ebp),%ecx
movl 12(%ebp),%edx
movl 16(%ebp),%eax

movl (%ecx),%eax
movl (%eax),%edx

movl %edx,(%eax)
movl %eax,(%ecx)
movl %ecx,8(%ebp)

movl %ebp,%esp
ret
如果0x400是第一个值的地址,则以下地址的值如下所示

0x400=1
0x404=2
0x408=3
0x412=25
0x416=4
0x420=5
0x424=6
0x428=25
0x432=7
0x432=8
0x436=9
0x400=1
0x404=2
0x408=3
0x412=4
0x416=5
0x420=6
0x424=7
0x428=8
0x432=9
当我认为它应该是

0x400=1
0x404=2
0x408=3
0x412=25
0x416=4
0x420=5
0x424=6
0x428=25
0x432=7
0x432=8
0x436=9
0x400=1
0x404=2
0x408=3
0x412=4
0x416=5
0x420=6
0x424=7
0x428=8
0x432=9
我试图解决这个问题,但根据数组的维度,“不可见列”的数量会以我不理解的方式发生变化

被调用的arg是

void update(int **board, int width, int height)
我的集会看起来像

1 2 3 25
4 5 6 25
7 8 9 
.file   "xxxxxx.c"
.text
.globl update
.type   update, @function
update:

pushl %ebp
movl %esp, %ebp

movl 8(%ebp),%ecx
movl 12(%ebp),%edx
movl 16(%ebp),%eax

movl (%ecx),%eax
movl (%eax),%edx

movl %edx,(%eax)
movl %eax,(%ecx)
movl %ecx,8(%ebp)

movl %ebp,%esp
ret

为什么会发生这种情况?如何使数组在内存地址中正常工作?

不保证
int**
样式2D数组的元素在内存中是连续的。您应该使用第一级指针数组来访问子数组。有道理,我认为int**syle 2D数组与int[][]数组相同。在我的教科书中,我看到2D数组对于每个索引都有连续的内存点,并假设int**也是一样的。非常感谢。