Pointers 指针访问时内存(sbrk)16字节对齐移位

Pointers 指针访问时内存(sbrk)16字节对齐移位,pointers,memory-management,memory-alignment,sbrk,memory-access,Pointers,Memory Management,Memory Alignment,Sbrk,Memory Access,我使用sbrk编写了一个相当基本的内存分配器。我需要一块内存,比如说65k,然后根据需要将它分割成需要动态内存的变量。我通过将内存添加回65k块来释放内存。65k块由union sizeof(16字节)派生而来。然后我沿着一个偶数为16字节的边界对齐块。但我有了不寻常的行为 当我分配并开始填充我的数据结构时,访问内存看起来很好。在我的一个函数调用中,我传递一个指向全局结构中某个成员变量的指针,但指针参数的地址不会直接映射到该成员的地址 例如,该特定成员的实际地址恰好是:0x100313d50,但

我使用sbrk编写了一个相当基本的内存分配器。我需要一块内存,比如说65k,然后根据需要将它分割成需要动态内存的变量。我通过将内存添加回65k块来释放内存。65k块由union sizeof(16字节)派生而来。然后我沿着一个偶数为16字节的边界对齐块。但我有了不寻常的行为

当我分配并开始填充我的数据结构时,访问内存看起来很好。在我的一个函数调用中,我传递一个指向全局结构中某个成员变量的指针,但指针参数的地址不会直接映射到该成员的地址

例如,该特定成员的实际地址恰好是:0x100313d50,但在执行特定函数时(无特殊情况),该成员的地址表示为0x100313d70。在调试器中,我可以查询实际地址,当它出现在函数中时,它看起来是正确的。这也不是第一个被访问的成员,它是第三个,所以之前的两次内存访问都可以,但是在第三次访问期间,我看到了这种不寻常的变化

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

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

干杯, 特蕾西


Solaris10,SunStudio-12,现代SPARC处理器上的C语言(如果这有帮助的话)。

我想我应该回答自己的问题,以防其他人有类似的问题

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


简单地说,我写过了缓冲区。由于我从尾部分发内存,所以重写会使我的全局结构(或其他结构)急需的元地址被吹走。现在我知道了未定义的行为是什么样子了。

我只是尝试使用malloc而不是sbrk,行为是一样的。嗯,它看起来与我的内存分配器无关。我将所有动态内存请求替换为普通的malloc,并在同一结构成员上使用相同的行为(不同的内存位置)替换为free,但使用相同的奇数指针偏移量。确切地说,您知道一个未定义行为的示例是什么样子的。可能还有一百万人;)+最后一句是1@Mikeage:我认为OP的意思是“未定义的行为看起来像什么”,这是一种试图追踪意外且难以解释的程序行为的整个体验。听起来好像在每次分配之前,内存分配器的控制结构的地址都存储了,所以释放内存的调用可以找到该结构?如果是这样,我使用的另一种方法是在64k边界上对齐整个页面。然后,如果需要释放分配,我可以通过以下方式找到控制结构:
pctrl=pvFreeing&~0xffff