| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 890 人关注过本帖
标题:两次输出指针为何不同呢?
只看楼主 加入收藏
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
收藏
 问题点数:0 回复次数:13 
两次输出指针为何不同呢?

#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不同呢?
}

搜索更多相关主题的帖子: 指针 输出 
2006-08-10 16:51
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
既然知道返回局部变量的地址是不妥当的,就应该知道为什么不妥当:局部变量存放在一个叫作栈的“容器”里,块(大括号)结束后,块中的变量所占用的内存都被释放,那么就是位知的值。但是如果改一下,就没问题了:
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;
}

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-10 18:53
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
收藏
得分:0 

请问为何再程序最后要加一个加上"delete pr" ???
如果没有delete pr;也可以通过并且输出相同,
那么加上"delete pr"是否画蛇添足了呢????

[此贴子已经被作者于2006-8-11 11:23:14编辑过]

2006-08-11 11:17
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
得分:0 
delete好像是 释放*pr所站的内存。一个清理工作。斑竹不知道我理解的对不对

2006-08-11 13:41
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
得分:0 
int value=100 与int *value=new int(100);
有什么本质上区别啊 我只知道value=100是把value赋值100而int *value=new int(100);是为*value开辟一个内存空间 在详细的我就不是很了解了,斑竹能解释一下吗?

2006-08-11 13:47
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
to 3楼:
delete pr在这个程序看起来是没作用,但是这是一个习惯,在new之后对应的一个清理工作。

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

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-11 14:30
yeshirow
Rank: 4
等 级:贵宾
威 望:10
帖 子:854
专家分:0
注 册:2006-6-8
收藏
得分:0 

使用 new 分配的記憶體, 應該使用 delete 釋放 (資源管理)

int *value = new int(100);

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


原來朋友仔感情再天真, 亦是我永遠也會愛惜的人, 明日愛他人, 也記住學會不要緊; 原來朋友比戀人更高分, 亦讓我開始懂得不記恨, 若大家都敏感, 我更要永遠記得拒絕再因小事怪人, 爲何沒有這條校訓...Twins-朋友仔 MCSD Training
2006-08-11 15:05
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
你要知道栈区的地址是带有一定偶然的
你的void somefn(char *str)
{
int a=40;
cout<<str<<endl;
}

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

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-08-11 15:47
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
得分:0 
我的意思是说 你那里是用的是个指针 而LZ用的是个变量 为什么用变量结果就会不同呢?
我对堆了堆盏 不是非常的了解 数据结构一直被我称为“天书”郁闷啊

2006-08-11 16:12
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
而int *value=new int(100);是为*value开辟一个内存空间 在详细的我就不是很了解了,斑竹能解释一下吗?
开辟一个int空间
100来初始化

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-08-11 16:24
快速回复:两次输出指针为何不同呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017745 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved