困扰好多天的一个诡异问题

jalang 2011-05-13 01:05:36
一个类的头文件中某个变量,如果我直接调用这个变量,那就不会有任何问题,但是如果这个变量用内联函数返回

(如 int* x;int* getx(){return x;}),那么返回回来的实际地址就会有所偏移(这里是指变量本身的地址,而不是指变量指向的地址)。

不是内存对齐的问题,我把内存对齐方式打出来了,都是8。

奇怪的是,如果我把这个返回函数写成非内联的,那返回回来的地址就正确了,但是这时候,又会有其他的变量返回出问题。

如果我把这个变量放在类开始的地方,这个问题也没有了。但是也是会有其他变量返回出问题。

求高人指点,给点思路。

对了,这个类对象是一个静态对象。

工程我重编过很多次了,所有中间文件也都删过了。

另,我的编译环境是2008
...全文
123 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jalang 2011-05-13
  • 打赏
  • 举报
回复
变量的地址是一样的呢[Quote=引用 8 楼 allenjiao 的回复:]
断点调试一下
你看看i变量的地址是不是一样的
[/Quote]
allenjiao 2011-05-13
  • 打赏
  • 举报
回复
断点调试一下
你看看i变量的地址是不是一样的
work1s 2011-05-13
  • 打赏
  • 举报
回复
int* x;int* getx(){return x;}),
x是一个指针变量,getx返回一个指针便量x。你具体是怎么应用的?
x=getx()?
还是getx()
{
int *x=this; //返回的就是函数的地址,如果 int *x=5;返回的就是地址5,
return *x;
}
这样应该是没问题的
jalang 2011-05-13
  • 打赏
  • 举报
回复
return m_pDb; }
00434F6C mov eax,dword ptr [this]
00434F6F mov eax,dword ptr [eax+3Ch]
00434F72 pop edi
00434F73 pop esi
00434F74 pop ebx
00434F75 mov esp,ebp
00434F77 pop ebp
00434F78 ret

这里的00434F6F mov eax,dword ptr [eax+3Ch]
3Ch这个值是错的,m_pDb的实际偏移是this+28h
jalang 2011-05-13
  • 打赏
  • 举报
回复
是啊,比如这个*x == 5;我直接用就没问题,但是如果用内联函数返回,就一定会出问题,比如int *i = getx();*i就不是5了
Lactoferrin 2011-05-13
  • 打赏
  • 举报
回复
int* x;int* getx(){return x;}
你这个返回的是x指向的地址
贪食蛇男 2011-05-13
  • 打赏
  • 举报
回复
详细代码上来。
jalang 2011-05-13
  • 打赏
  • 举报
回复
没有啊 ,头文件声明的啊。在头文件定义的话编不过的吧
贪食蛇男 2011-05-13
  • 打赏
  • 举报
回复
你把变量定义在头文件里吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧