2010-12-08 148 views
2

我有一些C代码在这里指针分配并返回到父调用者/父函数。使用GDB,我注意到指针分配很好,但是当我返回时,它丢失了地址前四个字节的高位。基本上,它是这样的:C指针的麻烦:它从函数返回时丢失地址信息

allocate pointer A 
allocate pointer B 
Free A 
Return B 

现在,如果我更改为:

allocate pointer B 
allocate pointer A 
Free A 
Return B 

事情做工精细。奇怪的是,这段代码工作正常5年以上,现在它给我们带来了一些非常特殊情况下的麻烦。我们担心的是,地址被改变了,我们无法以其他方式检测到这个错误,只有当我们连接gdb并开始环顾四周时,我们才看到了改变。

任何人在这里看到类似的东西或知道为什么会发生这种情况?顺便说一句,我们不是试图写更多的东西,我们可以在A或B中处理,两个缓冲区都适合数据大小。

在此先感谢您的任何线索。

+9

如果没有任何代码检查,很难回答这个问题。 – 2010-12-08 19:17:00

+1

这很含糊。 – 2010-12-08 19:17:07

+1

你不`分配一个指针`,你`分配指针引用的数据`。 – 2010-12-08 19:18:02

回答

3

像你这样的气味没有声明你的函数原型。这在32位机器上运行良好,其中intvoid*具有相同的宽度。现在这些是不同的,你松开你的高位字节。

你编译-Wall或类似的东西,我想?

1

这可能是由于很多原因,缓冲区溢出,有限的堆空间等。过帐代码将有所帮助!

0

这几乎肯定是由于内存损坏,即写入随机地址或超过堆栈上分配的对象或对象的末尾。