int
main
(
int
argc
,
char
*
argv
[
]
)
{
printf
(
"%s\n"
,
getstring
(
)
)
;
return
0
;
解析:char *getstring(void)函数中的p数组是局部变量,在栈空间。在函数调用结束后,局部变量销毁。但是这时函数返回值却是指向销毁内存的指针,这是野指针。千万不要返回局部变量的地址。在char p[]前加static就变成局部静态,生存期是整个程序执行期间,所以这时候返回它的指针可以读取这块空间
例2 牛客题目:
string& test_str(){
string str = "test";
return str;
int main(){
string& str_ref = test_str();
cout << str_ref << endl;
return 0;
A.编译警告
B.返回局部变量的引用,运行时出现未知错误
C.正常编译且运行
D.把代码里的&都去掉之后,程序可以正常运行
答案:A B D
分析:在C语言中,局部变量是分配在栈空间上的, 当函数调用结束后,由编译器释放.
通过调用test_str得到了他的局部变量的内存地址, 然而在main函数中调用函数时,这个内存地址被”破坏”了, 所以出现了这个意想不到的结果.
所以我们在书写C语言程序时候, 如果返回指针(变量地址),应该返回堆区或者全局区的,这样就可以避免这个”意想不到的”结果
reference:
原文:https://blog.csdn.net/u012222482/article/details/52458429
原文:https://blog.csdn.net/chenzhen1213/article/details/43833313
例1char *getstring(void){ char p[]="hello everyone"; return p;}int main(int argc, char* argv[]){ printf("%s\n",getstring()); return 0;}解析:char *getstring(void)函数中的p...
大家都知道一个常识:“C++中千万
不要返回局部对象或
变量的引用和指针”。
既然所有C++权威的书上都要求“一定
不要返回局部对象或
变量的引用和指针”,那为什么C++编译器不从语法上直接禁掉这种用法。如果只是建议的话,那么“
返回局部对象或
变量的引用和指针”是否有用武之地呢?(从理论上来讲,我认为这种做法似乎总是错误的,原因大家都知道。)
class CComplex
C++Primer第7章函数一节,讲到
返回时,“理解
返回引用至关重要的是,千万不能
返回局部变量的引用”,
意思是
返回程序内部定义的
变量时可能会出问题,因为当函数执行完毕后,将释放分配给局部对象的存储空间。
此时,对局部对象的引用就会指向不确定的内存。
如果函数返回的是局部变量的值,不涉及地址,程序不会出错。
但是如果函数返回的是局部变量的地址(指针)的话,程序运行就会报错。指针指向的地址当然是存在的,只是它指向的数据已经不在了。
准确的说,函数不能返回指向栈内存的指针,返回指向堆内存的指针是可以的。
下面举几个例子
int *fun(){
int a;
return &a; 无意义, 那片空间已回收
char *fun(){
char buf[]="hello world"; "hello world!"是局部变量存放.
文章目录1、问题描述2、问题原因3、解决办法4、总结4.1、返回指向字符串常量的指针4.2、不能返回以局部变量方式创建的字符串数组首地址4.3、在函数中,允许返回局部变量的值,不允许返回局部变量的地址4.4、函数的返回值可以是一个static类型的局部变量的地址4.5、数组是不能作为函数的返回值4.6、可以返回指向堆内存的指针
1、问题描述
toChinese是将数字转换成中文数字
编译时提示...
最近在写代码的时候遇到返回局部变量的引用问题,认识不是很清晰,下面是转自http://blog.csdn.net/tujinqiuqq85948239/article/details/27236677博文的详细解释!
在Effective C++中明确指出:不应该返回局部变量的引用,原因在于:局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,程序会进入未知状态。如果比较理解...