新微赢技术网

标题: 两次输出指针为何不同呢? [打印本页]

作者: 日-出    时间: 2009-11-3 04:05
标题: 两次输出指针为何不同呢?
#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不同呢?
}
作者: ミつン戀ン    时间: 2009-11-3 04:05
既然知道返回局部变量的地址是不妥当的,就应该知道为什么不妥当:局部变量存放在一个叫作栈的“容器”里,块(大括号)结束后,块中的变量所占用的内存都被释放,那么就是位知的值。但是如果改一下,就没问题了:
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;
}
作者: ωǒ吥婲鈊┌    时间: 2009-11-3 04:05
请问为何再程序最后要加一个加上"delete pr" ???
如果没有delete pr;也可以通过并且输出相同,
那么加上"delete pr"是否画蛇添足了呢????
作者: ︶ㄣ风飄零ヤ    时间: 2009-11-3 04:05
delete好像是 释放*pr所站的内存。一个清理工作。斑竹不知道我理解的对不对
作者: 香叶aiq格格    时间: 2009-11-3 04:05
int value=100 与int *value=new int(100);
有什么本质上区别啊 我只知道value=100是把value赋值100而int *value=new int(100);是为*value开辟一个内存空间 在详细的我就不是很了解了,斑竹能解释一下吗?
作者: ︶ㄣlоve_    时间: 2009-11-3 04:05
to 3楼:
delete pr在这个程序看起来是没作用,但是这是一个习惯,在new之后对应的一个清理工作。

to 5楼:
int value=100;是在栈里分配内存空间存储数据100;
int *value=new int(100);是在堆里分配内存空间存储数据100;
栈的内存会因为生命周期的结束而自动释放内存,堆则需要我们来手动的清理不需要的内存,让他回收再利用。
作者: `|楛纞♂ぺ﹖    时间: 2009-11-3 04:05
使用 new 分配的記憶體, 應該使用 delete 釋放 (資源管理)

int *value = new int(100);

定義一個 int 類的變數 value, 並使用了 int 的構造函數 int(__int32). 記憶體空間由此構造函數分配.
作者: 水乡渔夫    时间: 2009-11-3 04:05
你要知道栈区的地址是带有一定偶然的
你的void somefn(char *str)
{
int a=40;
cout<<str<<endl;
}

str破坏了刚才的栈布局,有可能移位,有可能是全新的地址
不是刚才的地址了
你第一次输出对了,是因为那个地址没有被动过.
作者: 半个灵魂    时间: 2009-11-3 04:05
我的意思是说 你那里是用的是个指针 而LZ用的是个变量 为什么用变量结果就会不同呢?
我对堆了堆盏 不是非常的了解 数据结构一直被我称为“天书”郁闷啊
作者: 水乡渔夫    时间: 2009-11-3 04:05
而int *value=new int(100);是为*value开辟一个内存空间 在详细的我就不是很了解了,斑竹能解释一下吗?
开辟一个int空间
100来初始化




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2