#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef struct
{
char *data;
int cur; //指示器cur代表指针,指示的节点在数组中的相对位置
} Node,SLinkList[MAXSIZE];
void Initspace_SL(SLinkList &space)
{
int i;
for (i = 0; i < MAXSIZE-1;++i)
{
space[i].cur = i+1;
}
space[MAXSIZE-1].cur = 0;
}//初始化
根据反汇编的结果
mov %edx,(%rax)
gdb调试:
第一次执行循环的情况
rax中存的地址为0x7fffffffdd98,该地址的值为1
space[0].cur的地址是0x7fffffffdd98 ,该地址的值为1
第二次执行循环
rax中存的地址为0x7fffffffdda8,该地址的值为2
space[1].cur的地址是0x7fffffffe3d8 ,该地址的值为6300256
所以找到了问题,第一次执行循环,最后寄存器rax中存地址就是space[0].cur的地址,第二次执行rax存的地址不是space[1].cur的地址,所以第二次循环2
传递给了0x7fffffffdda8。
另外 用vs调试发现 给结构体分配了八个字节,所以每次从rax向space[i].cur的值传递是正确的,用gdb调试 ,确发现给space[1]分配了80个字节。同样在gdb中,按照八个字节计算space[1].cur 的应该是dda8,实际上是e3d8与dd98差了80个字节。
详细的调试过程 我把它贴在了博文里面。---------------------
https://blog.csdn.net/qq_41160843/article/details/82961963?utm_source=copy