静态链表初始化中出现的问题?
 #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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐