免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1216 | 回复: 2
打印 上一主题 下一主题

[求助]关于局部内存,指针传递的疑惑? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-24 14:53 |只看该作者 |倒序浏览
#include <iostream>
#include <cstdlib>
using namespace std;

int    *g_nPointer;
int    g_nValue;
int    *ptr;

int *TAB()
{
    int ret;
    return (&ret);
}

void Victom()
{
    ptr = TAB();
    *ptr = 42;
    g_nPointer = ptr;//这里我让它们指向同个内容
    g_nValue = (int)&ptr;
    cout << "*ptr = " << *ptr << endl;
    cout << "ptr = " << ptr << endl << "&ptr = " << &ptr << endl;
    cout << "*ptr = " << *ptr << endl;
   
}

int main(void)
{
    Victom();
    cout << "*g_nPointer = " << *g_nPointer << endl;
    cout << "*g_nPointer = " << *g_nPointer << endl;
    cout << "g_nValue = " << g_nValue << endl;
    g_nPointer = (int *)g_nValue;
    cout << "g_nPointer = " << g_nPointer << endl;
    cout << "*g_nPointer = " << *g_nPointer << endl;
    printf("g_nValue = 0x%x\n", g_nValue);
   
    int *pTest;
    int x = 5;
    pTest = &x;
    cout << "pTest = " << pTest <<" *pTest = " << *pTest << endl;
    cout << "pTest = " << pTest <<" *pTest = " << *pTest << endl;

    system("pause");
        return 0;
}





操作系统为:WIN2003企业版 Intel P4 2.0G

[dev-cpp结果]
*ptr = 0//????????? 这里与VC的不同,为什么这里变成“0”?似乎应该是“42”
ptr = 0x22ff34
&ptr = 0x443018
*ptr = 0//?????????这里的值和上面的值相等,都为“0”,而VC中这里就发生了变化
*g_nPointer = 0//?????????为什么连续打印的两个值会不同
*g_nPointer = 10//?????????

g_nValue = 4468760
g_nPointer = 0x443018
*g_nPointer = 2293556
g_nValue = 0x443018
pTest = 0x22ff70 *pTest = 5
pTest = 0x22ff70 *pTest = 5
请按任意键继续. . .

[Visual Studio 2005 /Visual Studio 6.0 结果]
*ptr = 42//?????????
ptr = 0012FD9C
&ptr = 004184DC
*ptr = 274148040//?????????为什么这里的值会变呢?中间没有对它的内容作任何改变。
*g_nPointer = 274148040//?????????
*g_nPointer = 1244584//?????????

g_nValue = 4293852
g_nPointer = 004184DC
*g_nPointer = 1244572
g_nValue = 0x4184dc
pTest = 0012FF54 *pTest = 5
pTest = 0012FF54 *pTest = 5
请按任意键继续. . .


难道这也和++,--的多重操作一样不可预测性?
以前书上没有看到过或者看的时候不够仔细,没有印象,不知道为何原因?
今天看一片文章的时候,做实验才发现。
小弟不懂,希望能得到 CUers 们的指点!非常谢谢!

P.S 如果有人曾经问过这样的问题,版主请删除我的帖并把它的链接告诉我。

[ 本帖最后由 matthew6868 于 2006-1-24 14:59 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-01-24 15:14 |只看该作者
Simple answer:
Never ever return a local var pointer!

Complex answer:
You have to confirm there are NO implicit stack write (eg. a function call).
Sometimes, it depends on your compiler, even on language itself.

论坛徽章:
0
3 [报告]
发表于 2006-01-24 15:30 |只看该作者
谢谢JohnBull版主的答复。
我也注意到可能是因为局部变量放在栈中,在作用域之外就自动回收,放在堆内存(new)就一切正常了。

我也觉得结果会变得无法预测,不过连续打印两次,为什么它的值都会发生变化?有点想不通
[dev-cpp]
*g_nPointer = 0//?????????为什么连续打印的两个值会不同
*g_nPointer = 10//?????????
[VC]
*g_nPointer = 274148040//?????????
*g_nPointer = 1244584//?????????
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP