1

我使用 sbrk 编写了一个相当基本的内存分配器。我要求一块内存,比如 65k,并根据需要将其划分为请求动态内存的变量。我通过将内存添加回 65k 块来释放内存。65k 块源自 union sizeof(16-bytes)。然后我将块沿偶数 16 字节边界对齐。但我有不寻常的行为。

当我分配并开始填充我的数据结构时,访问内存看起来不错该成员的地址。

例如,这个特定成员的真实地址恰好是:0x100313d50,但在执行特定函数(没有什么特别之处)时,该成员的地址被表示为 0x100313d70。在调试器内部,我可以查询真实地址,并且在它出现的函数内部时它看起来是正确的。这也不是第一个被访问的成员,它是第三个,所以之前的两次内存访问都很好,但是在第三次访问期间,我看到了这种不寻常的转变。

我是否有可能通过未对齐的块访问此内存?这是可能的,但我希望会引发 SIGBUS 异常(SPARC 芯片)。我正在使用 -memalign=16s 进行编译,因此它应该使用 SIGBUS 而不是捕获和修复错位。

我所有的结构都填充在 16 字节的倍数上:sizeof(structure)%16 = 0。有没有人有过这种行为的经验?一般来说,什么类型的东西/东西/等等。可能会导致指针错误表示内存地址?

干杯,特蕾西。

现代 SPARC 处理器上的 Solaris 10、SunStudio-12、C 语言(如果有帮助的话)。

4

1 回答 1

3

我想如果其他人有类似的问题,我应该回答我自己的问题。

内存地址发生移动的原因是因为先前调用实用程序函数意外覆盖了全局结构的元地址,从而重写了该块的元地址,因此即使实际数据仍然存在,对该块的查找也被移动了在原始块中。

简而言之,我写过了我的缓冲区。由于我从尾部分配内存,因此覆盖会吹走我急需的全局结构(或其他)的元地址。现在我知道未定义的行为是什么样的了。

于 2009-09-23T23:18:51.680 回答