关于C语言中返回局部变量和局部指针变量
2015-09-11 14:10
274 查看
char *test1(void)
{
char b[10] = "abcde";
return b;
}
char *test1_ver2(void)
{
static char b[10] = "abcde";
return b;
}
char *test2(void)
{
char c[10] = "abcde";
char *pStr = c;
return pStr;
}
char *test3(void)
{
char *c = "abcdef";
return c;
}
test1不能运行,甚至可能无法编译通过;因为char b[10] 是局部变量,其存放在栈上,在函数执行完成就会被释放。而返回它存放的地址,此时已经是可能是个非法地址。
test1_ver2可以正确运行,在test1中,我们说test1不能运行或出现编译错误的原因是 b[]数组在函数执行结束后会被释放,如果我们再对其存放空间进行访问就会出错,此时我们定义static char b[10]; 将其存放在静态存储区,只有在程序运行结束后才会被系统回收,即使退出该函数,b[]数组存放的静态存储区始终存在,所以,我们再对其进行访问,不会出现错误
test2可以运行。c[10]和*pStr均保存在栈中;该函数返回值是保存在pStr指针中的c数组在栈中的存放地址,当调用该函数时,该地址被复制到外部的指针变量中,然后,保存在栈上的c[]数组和pStr指针的内存空间被释放。c[]数组的存放地址是被传送出去了的,但是,由于c[]是局部变量, 在函数执行完成后,存放的内存空间就被释放,所以,在外部通过指针访问c[]数组时,指向的内存空间无效,而且还可能出现访问非法内存的危险。虽然这样能够运行,但是没有实际效果
test3可以运行。*c指针c是保存在栈中,"abcdef"字符串保存在文字常量区,其存放空间,直到程序执行结束才会被系统回收。所以,返回它的地址是一个实际存在的有效地址。
{
char b[10] = "abcde";
return b;
}
char *test1_ver2(void)
{
static char b[10] = "abcde";
return b;
}
char *test2(void)
{
char c[10] = "abcde";
char *pStr = c;
return pStr;
}
char *test3(void)
{
char *c = "abcdef";
return c;
}
test1不能运行,甚至可能无法编译通过;因为char b[10] 是局部变量,其存放在栈上,在函数执行完成就会被释放。而返回它存放的地址,此时已经是可能是个非法地址。
test1_ver2可以正确运行,在test1中,我们说test1不能运行或出现编译错误的原因是 b[]数组在函数执行结束后会被释放,如果我们再对其存放空间进行访问就会出错,此时我们定义static char b[10]; 将其存放在静态存储区,只有在程序运行结束后才会被系统回收,即使退出该函数,b[]数组存放的静态存储区始终存在,所以,我们再对其进行访问,不会出现错误
test2可以运行。c[10]和*pStr均保存在栈中;该函数返回值是保存在pStr指针中的c数组在栈中的存放地址,当调用该函数时,该地址被复制到外部的指针变量中,然后,保存在栈上的c[]数组和pStr指针的内存空间被释放。c[]数组的存放地址是被传送出去了的,但是,由于c[]是局部变量, 在函数执行完成后,存放的内存空间就被释放,所以,在外部通过指针访问c[]数组时,指向的内存空间无效,而且还可能出现访问非法内存的危险。虽然这样能够运行,但是没有实际效果
test3可以运行。*c指针c是保存在栈中,"abcdef"字符串保存在文字常量区,其存放空间,直到程序执行结束才会被系统回收。所以,返回它的地址是一个实际存在的有效地址。
相关文章推荐
- C++11带来的优雅语法
- 如何在C++代码中连接QML代码中的信号
- c++ list, vector, map, set 区别与用法比较
- [转]关于C与C++中互相调用动态链接库的问题_卓越李子_新浪博客
- C++ 资源表
- 第二周项目1——c/c++语言中函数参数传递的三种方式
- Item 25:考虑实现一个不抛异常的swap Effective C++笔记
- C语言中auto,register,static,const,volatile的区别详细解析
- C++类模板的使用-排序
- C++ Primer的课后规划问题的第八章
- C语言程序变异的内存分配
- C++基础学习
- C++学习笔记1(带参数的main( )函数)
- Effective C++ 条款42 了解typename的双重意义
- C++数组名的思考
- 【C++拾遗】 explicit关键字
- C++/CLI中MFC与.NET的互操作
- 大数求余
- C++友元函数和友元类
- C++容器使用经验总结