设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 790|回复: 9
打印 上一主题 下一主题

两次输出指针为何不同呢?

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 04:05:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <iostream.h>
int *getint(char *str)//指针函数
{
int value=100;
cout<<str<<endl;
return &value;//warning :将局部变量返回是不妥的!
}
void somefn(char *str)
{
int a=40;
cout<<str<<endl;
}
void main()
{
int *pr=getint("input a value:"); //赋值取自返回的指针值。
cout<<*pr<<endl; //第一次输出*pr
somefn("it's uncertain:"); //这个函数调用后----------
cout<<*pr<<endl; //第二次输出*pr
//为何两次输出 的*pr不同呢?
}
2#
发表于 2009-11-3 04:05:46 | 只看该作者
既然知道返回局部变量的地址是不妥当的,就应该知道为什么不妥当:局部变量存放在一个叫作栈的“容器”里,块(大括号)结束后,块中的变量所占用的内存都被释放,那么就是位知的值。但是如果改一下,就没问题了:
int *getint(char *str)//指针函数
{
    int *value=new int(100);
    cout&lt;&lt;str&lt;&lt;endl;
    return value;

}

void somefn(char *str)
{
    int a=40;
    cout&lt;&lt;str&lt;&lt;endl;
}

void main()
{
    int *pr=getint("input a value:");
    cout&lt;&lt;*pr&lt;&lt;endl;               //第一次输出*pr
    somefn("it's uncertain:");
    cout&lt;&lt;*pr&lt;&lt;endl;               //第二次输出*pr
    delete pr;
}
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 04:05:47 | 只看该作者
请问为何再程序最后要加一个加上"delete pr" ???
如果没有delete pr;也可以通过并且输出相同,
那么加上"delete pr"是否画蛇添足了呢????
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 04:05:48 | 只看该作者
delete好像是 释放*pr所站的内存。一个清理工作。斑竹不知道我理解的对不对
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 04:05:49 | 只看该作者
int value=100 与int *value=new int(100);
有什么本质上区别啊 我只知道value=100是把value赋值100而int *value=new int(100);是为*value开辟一个内存空间 在详细的我就不是很了解了,斑竹能解释一下吗?
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 04:05:50 | 只看该作者
to 3楼:
delete pr在这个程序看起来是没作用,但是这是一个习惯,在new之后对应的一个清理工作。

to 5楼:
int value=100;是在栈里分配内存空间存储数据100;
int *value=new int(100);是在堆里分配内存空间存储数据100;
栈的内存会因为生命周期的结束而自动释放内存,堆则需要我们来手动的清理不需要的内存,让他回收再利用。
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 04:05:52 | 只看该作者
使用 new 分配的記憶體, 應該使用 delete 釋放 (資源管理)

int *value = new int(100);

定義一個 int 類的變數 value, 並使用了 int 的構造函數 int(__int32). 記憶體空間由此構造函數分配.
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-3 04:05:53 | 只看该作者
你要知道栈区的地址是带有一定偶然的
你的void somefn(char *str)
{
int a=40;
cout<<str<<endl;
}

str破坏了刚才的栈布局,有可能移位,有可能是全新的地址
不是刚才的地址了
你第一次输出对了,是因为那个地址没有被动过.
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-3 04:05:54 | 只看该作者
我的意思是说 你那里是用的是个指针 而LZ用的是个变量 为什么用变量结果就会不同呢?
我对堆了堆盏 不是非常的了解 数据结构一直被我称为“天书”郁闷啊
回复 支持 反对

使用道具 举报

10#
发表于 2009-11-3 04:05:55 | 只看该作者
而int *value=new int(100);是为*value开辟一个内存空间 在详细的我就不是很了解了,斑竹能解释一下吗?
开辟一个int空间
100来初始化
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 10:37 , Processed in 0.065986 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表