您的位置:首页 > 编程语言 > C语言/C++

C/C++能否返回局部变量

2017-03-25 17:07 204 查看
1.C/C++能返回static修饰的局部变量(因为在静态存储区)

2.C/C++能返回用 new 创建的局部变量(因为在堆空间)

3.C/C++能返回指向常量的指针,但不能返回指向普通局部变量的指针,否则返回的是乱码(因为后者创建在栈空间)

4.C/C++能返回局部变量的值

预备知识:   1.当函数结束时,在栈空间的该函数的普通局部变量会被释放(清除)。

2.普通的局部变量是在 栈空间 生成的,所以但程序结束时,局部变量也会被清空。

1.C/C++能返回static修饰的局部变量(因为在静态存储区)                                                                                          

用static 修饰的变量是存储在静态存储区,而不是栈空间

下面的例子是错误的。

char *fun()
{
char p[]="hello world";
return p;
}

int main()
{
char *s = fun();
cout<<s<<endl;
return 0;
}//print:乱码
因为 p 相当一个数组头指针,他的内容都是在栈空间的,所以当 return p后,p是能成功传出去的,但其指向的内容已经被栈空间清除了,因此打印的是乱码。

而用static修饰后,就能成功打印出hello world,因为static修饰,就表示修饰的对象是创建在静态存储区,不受栈空间影响

char *fun()
{
static char p[]="hello world";
return p;
}

int main()
{
char *s = fun();
cout<<s<<endl;
return 0;
}//print:hello world


2.C/C++能返回用 new 创建的局部变量(因为在堆空间)                                                                                              

用 new 创建的变量是存储在 堆空间

int fun()
{
int *a = new int;
*a = 100;
return *a;
}

int main()
{
int num = fun();
cout<<num<<endl;
return 0;
}//print:100


3.C/C++能返回指向常量的指针,但不能返回指向普通局部变量的指针(因为后者创建在栈空间)                               

char *fun()
{
char *p="hello world";    //hello world 是字符串常量,生成在常量存储区,所以指针p是指向常量存储区
return p;
}

int main()
{
char *s = fun();
cout<<s<<endl;
return 0;
}//print:hello world
下面的代码是指针指向普通局部变量的情况:

char *fun()
{
char p[]="hello world";   //定义一个数组,并赋值。数组p 是在栈空间
return p;
}

int main()
{
char *s = fun();
cout<<s<<endl;
return 0;
}//print: 乱码


4.C/C++能返回局部变量的值                                                                                                                                           

int fun()
{
int a = 100;
return a;
}

int main()
{
int num = fun();
cout<<num<<endl;
return 0;
}//print: 100
在函数返回中,return 后跟的东西是一定能返回出去的,这就是 局部变量的返回能值返回的原因,而地址返回(也就是指针)则看情况,要看他所指向的地方是否已经被释放掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: