qq_41160843 2018-10-09 07:17 采纳率: 0%
浏览 321

静态链表初始化中出现的问题?

 #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

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-01 13:13
    关注

    该回答引用ChatGPT

    静态链表初始化出现问题可能有以下几种情况:

    • 结构体定义问题:静态链表中的结构体定义不正确,导致在初始化时出现问题。
    • 内存分配问题:在初始化时没有正确分配内存,导致出现问题。
    • 指针操作问题:在对链表进行操作时,指针操作不正确,导致出现问题。

    针对你提供的代码,可能存在以下问题:

    • 结构体定义问题:你的静态链表结构体中的data成员是char指针类型,但是在初始化时并没有给它分配内存空间。这样可能导致在对data成员进行赋值时出现问题。可以考虑在初始化时对每个data成员分配一定的空间。
    • 内存分配问题:在Initspace_SL函数中,你给每个节点的cur成员赋值的方式是将其设为当前节点的下一个节点的相对位置。但是在该函数中并没有分配给每个节点具体的空间。如果你的空间没有被正确分配,可能导致节点之间的相对位置出现错误。
    • 指针操作问题:在Initspace_SL函数中,你对每个节点的cur成员赋值时,使用的是space[i].cur = i+1;的方式,这个操作是正确的。但是在你的反汇编结果和gdb调试中提到的问题中,是出现了指针操作错误的情况。这个问题可能与你的代码上下文有关,具体原因需要更多的信息才能确定。

    建议你检查一下代码中可能存在的问题,并结合具体情况进行分析和调试。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器