我使用sbrk写了一个合理的基本内存分配器。我要求一大块内存,比如65k并根据需要动态内存的变量进行刻录。我通过将其添加回65k块来释放内存。 65k块源自union sizeof(16字节)。然后我沿着一个偶数16字节的边界对齐块。但我的行为很不寻常。
访问内存看起来很好,因为我分配并开始填充我的数据结构接受我的一个函数调用,我传递指向全局结构中的成员变量的指针,但指针参数的地址不映射直接到该成员的地址。
例如,此特定成员的实际地址恰好是:0x100313d50但是当执行特定函数(没有什么特别的)时,成员的地址表示为0x100313d70。在调试器内部,我可以查询真实地址,并且在显示此功能的内部时它看起来是正确的。这不是第一个被访问的成员,它是第三个,所以两个先前的内存访问都很好,但在第三次访问期间,我看到这种不寻常的转移。
我是否有可能通过未对齐的块访问此内存?这是可能的,但我希望抛出一个SIGBUS异常(SPARC芯片)。我正在使用-memalign = 16s进行编译,因此应该使用SIGBUS而不是陷阱并修复错位。
我的所有结构都填充了16个字节的倍数:sizeof(结构)%16 = 0.有没有人有这种行为的经验?一般来说,什么类型的东西/东西/等。可能会导致指针错误地表示内存地址?
干杯, 崔西。
Solaris 10,SunStudio-12,现代SPARC处理器上的C语言(如果有帮助的话)。
答案 0 :(得分:3)
我认为如果其他人有类似的问题,我应该回答我自己的问题。
内存地址移位的原因是因为事先调用实用程序函数意外地覆盖了全局结构的元地址,从而重写了该块的元地址,因此即使实际上该块的查找也被移位数据仍然存在于原始块中。
简单来说,我写过我的缓冲区。因为我从尾部分发内存,所以覆盖会为我的全局结构(或其他任何东西)吹掉我急需的元地址。现在我知道未定义的行为是什么样的。