返回局部变量的地址

我们可能会经常写出这样的代码:
int  add(int  a , int  b)
{
  return  a + b;
}
当然,这是合理的写法,使函数的返回值为 int ,所以,调用函数后会返回一个int型的值。

今天,我想讨论的问题当然不是这个,请看下面这段代码:
char* Func_1(void)
{
  char str[30] = "Bruce";
  cout<<"str:"<<str<<endl;

  return str;     //???????
}
这里有问题吗?不是和上面一样吗?
当然不一样,上面的函数返回的是一个具体值,但是这个函数但会的是一个地址,那么,函数不可以返回地址吗?当然可以,只是,这里不行。
这里的地址是一个局部变量 str 的地址,我们都知道,局部变量是存储在栈里的,当函数执行时,其中的局部变量会执行压栈操作,但是,当函数执行完毕后,栈中的数据会弹出,以便腾出栈空间。
所以,当函数执行完毕后,指针指向的地址当然是存在的,只是它指向的数据已经不在了。
真的是这样吗?
下面给出一个例子:

#include <iostream>
#include <string>
using namespace std;  

const char* testValue = "BruceZhang";
char gstr[30] = {0};  //全局变量

char* Func_1(void);
char* Func_2(void);
char* Func_1(void)
{
    char str[30] = "Bruce";
    cout<<"str:"<<str<<endl;  

    return str;
}  

char* Func_2(void)
{
    strcpy(gstr, testValue);
    cout<<"gstr:"<<gstr<<endl;
    return gstr;
} 

int main(void)
{
 char* func_1;
 char* func_2;
 func_1 = Func_1();
 func_2 = Func_2();
 cout<<"func_1:"<<func_1<<endl;
 cout<<"func_2:"<<func_2<<endl;
 system("pause");
 return 0;
} 

下面的截图是在我的电脑上运行的结果:

由此可以看出,应该显示“Bruce”的地方,显示的是不能识别的乱码,由此,验证了上面的说法。
所以,我们在编写程序的时候需要注意,返回值如果是值,可以大胆的操作,但是,如如果返回的是地址,那么我们就需要考虑是不是局部自动变量的问题了。



装载自:http://blog.csdn.net/dlutbrucezhang/article/details/9528885

 

时间: 2024-12-10 19:12:29

返回局部变量的地址的相关文章

C++返回局部变量的地址

我们可能会经常写出这样的代码: int  add(int  a , int  b) { return  a + b; } 当然,这是合理的写法,使函数的返回值为 int ,所以,调用函数后会返回一个int型的值. 今天,我想讨论的问题当然不是这个,请看下面这段代码: char* Func_1(void) { char str[30] = "Bruce"; cout<<"str:"<<str<<endl; return str;  

Java和C的区别:关于调用函数返回局部变量

问题描述 话说C语言中每次写函数是都会告诉自己不要返回局部变量,而现在在学Java,发现写方法时返回局部变量却没有C中的问题,这是怎么回事,C中是因为调用结束后局部变量消失,对应地址里的内容不确定,而Java中又是怎么样的呢?? 解决方案 解决方案二:c里如果返回的是副本,而不是引用,那么局部变量不会消失,不是吗?在java里,由于是进行引用传递,他会在每一次对象赋值的时候进行引用计数,如果计数不为0,就不会回收局部变量,那么也就不会造成消失的问题解决方案三:引用1楼kifile的回复: c里如

struct-socket 11章 getaddrinfo函数为什么只返回loop0的地址

问题描述 socket 11章 getaddrinfo函数为什么只返回loop0的地址 #include ""unp.h"" inttcp_connect(const char *host const char *serv){ int sockfd n; struct addrinfo hints *res *ressave; bzero(&hints sizeof(struct addrinfo));hints.ai_family = AF_UNSPEC;

c++-关于C++函数返回字符串char*的问题

问题描述 关于C++函数返回字符串char*的问题 比如 char* fun() { char s1[10]; char *s2=new char[10]; //return s1; 报错,不能返回局部变量 return s2; } int main(int argcchar** argv) { char* s=fun(); delete[] s; //是否有必要??如果是返回const char*呢?? } 因为涉及到内存管理,实在太烦了 解决方案 S1 是静态的地址,不是局部变量的原因.s2

c++-C/C++谁申请谁释放原则

问题描述 C/C++谁申请谁释放原则 在C/C++中有一个原则"谁申请谁释放",那么下面的代码符合这个原则么? char *fun() { char *result = malloc(100); return result; } int main() { char *str = fun(); free(str); } 解决方案 不符合.应该主程序申请,将缓冲区指针传给函数,函数将结果填入. 例子:Windows API函数 GetWindowText,可以获取指定窗口的标题,函数原型

理解C语言——从小菜到大神的晋级之路(14)——C编程常见错误

本期视频:点击这里 1.混淆变量的作用域和生存期 变量的作用域和生存期实际上是两个完全不同的概念. 变量的作用域:可以应用这个变量的范围,强调变量使用的空间范围: 变量的生存期:变量的生命周期,强调变量有效的时间:        这两个概念中,作用域更强调变量可以被引用,而生存期更强调其本身是否存在,这二者实际上并没有必然联系.通常情况下,如果处于某个变量的作用域内,那么这个变量一定还在生存期:但是相反,某个变量已经不在其作用域,并不意味着其生存期已结束.变量的生存期常常远大于其作用域.    

Go程序设计语言2.3 变量

2.3 变量 var声明创建一个具体类型的变量,然后给它附加一个名字,设置它的初始值.每一个声明有一个通用的形式:   类型和表达式部分可以省略一个,但是不能都省略.如果类型省略,它的类型将由初始化表达式决定:如果表达式省略,其初始值对应于类型的零值--对于数字是0,对于布尔值是false,对于字符串是"",对于接口和引用类型(slice.指针.map.通道.函数)是nil.对于一个像数组或结构体这样的复合类型,零值是其所有元素或成员的零值. 零值机制保障所有的变量是良好定义的,Go里

C语言的传值与传址调用

传值调用并不能改变两个变量的值,而传址能. 为什么,因为,传值调用,仅仅是在函数内,调换参数的值. 而地址所指向的值,改变的不仅仅是函数内,函数外也改变. 请看代码: 这里还要注意:通常我们不会返回局部变量的地址. 1 #include <stdio.h> 2 3 void swap_value(int x,int y) 4 { 5 int temp; 6 temp = x; 7 x = y; 8 y = temp; 9 printf("传值函数内的输出 %d %d \n"

C# 访问一个地址后,如何获取返回的信息

问题描述 这个问题,我研究了一天半,试了各种办法,都未能搞定,希望大家能帮帮我如图:1比如普通浏览器,按F12调试,然后打开一个网页,network里面有收到好多返回的url地址,在WebBrowser里面,我要如何得到这些返回来的url地址呢?2用C#开发的,或者不用WebBrowser控件也行,访问一个地址后,要如何得到它的所有返回的URL呢? 解决方案 解决方案二:那些返回URL,是原网址所请求的url资源,可以先获取原网址内容,然后用正则表达式去获取url规则的字符串,这个算较简单的做法