首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于返回局部变量地址的有关问题

2013-11-18 
关于返回局部变量地址的问题程序中,有时候会提示是返回局部变量地址,而有时候却不,如下面的程序: string*

关于返回局部变量地址的问题
程序中,有时候会提示是返回局部变量地址,而有时候却不,
如下面的程序:
 

string* fff()
{
 string str("ha");
 return &str;
}
 属于返回局部变量地址,
而:
int* fff()
{
int p1 = 10;
 int *p = &p1;
 return p;
}

却不会提示返回局部变量地址,p1和p都属于局部变量,应该都是在栈上分配的吧,
是不是说,如果哦局部地址是通过调用构造函数产生的,则不能返回,如果是普通变量,则可以呢?
求解,
[解决办法]
这两种都不应该使用,都是返回的局部变量的地址,函数结束后这个地址保存的数据已不能保证正确了,使用有很大风险。
[解决办法]
语法有错的,编译器一定报错的。对于于有潜在风险的代码,编译器未必都要报错,否则就不会有那么多的bug
[解决办法]
程序不该依赖编译器是否报错,类似潜在的bug编译器是无法发现的(至少现在是这样),如果你在一个函数中返回局部变量的地址,而此局部变量(static成员例外)一旦函数调用完毕其生命周期就结束了,此时,如果你再去访问这个地址,虽然有时能正确的取到数据,但只是碰巧的情况,所以如果需要的话,最好还是在堆上为其分配个内存的好
[解决办法]
int* fff()
{
int p1 = 10;
 int *p = &p1;
 return p;
}

典型的bug代码之一,欺骗了编译器也欺骗了自己

[解决办法]
第一个是直接返回局部变量的地址的!
第二个是通过一个指针指向,返回指针的内容的而已!
虽然意思都是相同的!但是编译器没有这么智能!退一步说,这个只能说是一个严重bug,语法没有问题!
[解决办法]
引用:
Quote: 引用:

这两种都不应该使用,都是返回的局部变量的地址,函数结束后这个地址保存的数据已不能保证正确了,使用有很大风险。
 如果我是new了一个,比如 int *p = new int[5]; return p; 这是不是可以的,
new出来的都是在堆上存在的,而堆需要我们自己来管理,
正确!
[解决办法]
只能说能否访问到,要看电脑的心情,高兴了给你返回正常的值,不高兴了就给你想不到的值,千万别这么搞,会出大事的

热点排行