gpt4 book ai didi

c - 结构体中的指针值发生变化而不重新分配

转载 作者:行者123 更新时间:2023-11-30 17:16:27 24 4
gpt4 key购买 nike

我从 gdb 获得以下输出:

(gdb) print tid->rvm
$28 = (rvm_t) 0x605010
(gdb) step
306 rlog->entries[i].sizes[num - 1] = size;
(gdb) step
307 }
(gdb) print tid->rvm
$29 = (rvm_t) 0x64
(gdb) print tid
$30 = (trans_t) 0x607b50

这是tid结构的代码:

struct _trans_t {
rvm_t rvm;
int numsegs;
segment_t* segments;
};

rvm_t rvm 是一个包含可恢复虚拟内存分页器元数据的结构。

我不相信我可以发布发生这种情况的完整功能代码,因为这是一项大学作业,但您可以看到发生此更改的单行代码,rlog->entries [i].sizes[num - 1] = 大小;。没有提及所更改的值。我还必须使用这个丑陋的类型定义指针来构造东西。作业提交服务器按原样包含头文件,我无法编辑它。

我的问题是到底是什么导致了这种情况。 tid 作为参数传递给函数 rvm_about_to_modify(trans_t tid, void *segbase, int offset, int size)。该函数内部从未触及结构体成员 rvm,您可以看到它的地址为 0x605010(这是正确的地址)的步骤序列,一行之后,没有任何引用对于 tid 结构或其 rvm 成员,指针更改为地址 0x64。实际的tid指针没有改变。它始终保留地址 0x607b50。

我在这里完全不知所措,无法弄清楚什么会导致 tid->rvm 在不被触及的情况下改变值。据我所知,0x64是键盘状态寄存器的中断 vector 表条目的地址。如有任何帮助,我们将不胜感激。

编辑:

以下是一些请求的更新。 i的值为0,num的值为1,rlog的值为0x607b30。 rlog->entries[0] 是对名称为“testseg”、大小为 10000 字节、updatesize 为 300 字节、numupdates 1 以及指向偏移量、大小和数据数组的指针的数据段的更改的条目。 rlog->entries[0].sizes[0] 为 100。数据指针为 0x6051f0。

最佳答案

由于您无法发布完整代码,因此我们无法详细解释。然而,您关于“tid->rvm [更改]值而从未被触及”的断言是自相矛盾的。您可以说的是,结构成员 tid->rvm 不会通过结构指针 tid 进行更改,由正在调试的线程.

假设该结构不在共享内存中并且该进程是单线程的,则唯一可能的结论是 tid->rvm完全或部分由 rlog->entries[i].sizes[num - 1] 别名。也就是说,第二个表达式左侧引用的内存与第一个表达式引用的内存重叠。有几种可能发生的方式,其中:

  • tid 和/或 rlog 指针指向错误的位置
  • i 的当前值超出数组 rlog->entries 的范围
  • 表达式 num - 1 超出数组 rlog->entries[i].sizes

这些绝不是唯一的可能性,但它们是可以从提供的有限代码中猜测到的最有可能的可能性。

关于c - 结构体中的指针值发生变化而不重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29632391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com