我在这里有一些C代码,其中指针被分配并返回到父调用者/父函数。使用GDB,我注意到指针分配很好,但是当我返回它时,它会丢失地址前四个字节的高位。基本上它是这样的:
allocate pointer A
allocate pointer B
Free A
Return B
现在,如果我将其更改为:
allocate pointer B
allocate pointer A
Free A
Return B
事情很好。奇怪的是,这段代码工作了5年以上,现在它给我们一些非常具体的案件带来了麻烦。令我们担心的是地址已经改变,我们无法以任何其他方式检测到这个错误,只有当我们附加gdb并开始环顾四周时,我们才看到了变化。
任何人在这里看到类似的东西或知道为什么会这样?顺便说一句,我们并没有尝试编写超过A或B中可以处理的内容,两个缓冲区都是适合数据的大小。
提前感谢任何线索。
答案 0 :(得分:3)
闻起来好像你没有声明你的功能原型。多年来,在int
和void*
具有相同宽度的32位机器上,这种情况很好。现在这些是不同的,你放弃了高阶字节。
你想用-Wall
或类似的东西编译,我想?
答案 1 :(得分:1)
这可能是由于许多原因,缓冲区溢出,堆空间有限等。发布代码会有所帮助!
答案 2 :(得分:0)
这几乎肯定是由于内存损坏,即写入随机地址或超过堆栈中已分配对象或对象的结尾。