C语言的那些秘密之---函数返回局部变量
来源:互联网 发布:人工智能主要应用领域 编辑:程序博客网 时间:2024/04/24 08:54
C语言的那些秘密之---函数返回局部变量
分类: 编程语言 2011-08-17 13:06 2301人阅读 评论(5)收藏 举报
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。下面以函数返回局部变量的指针举几个典型的例子来说明:
1:
- #include <stdio.h>
- char *returnStr()
- {
- char *p="hello world!";
- return p;
- }
- int main()
- {
- char *str;
- str=returnStr();
- printf("%s\n", str);
- return 0;
- }
2:
- #include <stdio.h>
- char *returnStr()
- {
- char p[]="hello world!";
- return p;
- }
- int main()
- {
- char *str;
- str=returnStr();
- printf("%s\n", str);
- return 0;
- }
3:
- int func()
- {
- int a;
- ....
- return a; //允许
- }
- int * func()
- {
- int a;
- ....
- return &a; //无意义,不应该这样做
- }
局部变量也分局部自动变量和局部静态变量,由于a返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,
因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量
被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存
期从定义起到程序结束。
- #include <stdio.h>
- char *returnStr()
- {
- static char p[]="hello world!";
- return p;
- }
- int main()
- {
- char *str;
- str=returnStr();
- printf("%s\n", str);
- return 0;
- }
- int* func( void )
- {
- static int a[10];
- ........
- return a;
- }
6:返回指向堆内存的指针是可以的
- char *GetMemory3(int num)
- {
- char *p = (char *)malloc(sizeof(char) * num);
- return p;
- }
- void Test3(void)
- {
- char *str = NULL;
- str = GetMemory3(100);
- strcpy(str, "hello");
- cout<< str << endl;
- free(str);
- }
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- C语言的那些秘密之---函数返回局部变量
- 系统性能优化 Advanced SystemCare pro v6.1.9.215 多国语言特别版
- Hibernate中两种获取Session的方式 (转)
- C++函数对象与函数指针不同之处
- C语言编译过程总结详解
- memcached 完全解剖3——分布式算法
- C语言的那些秘密之---函数返回局部变量
- IE关于js new Date() 出现NaN 的解决(转)
- Office文档打不开,本文帮你立即解决问题
- linux下编写alsa测试程序
- 深入分析fork 和 vfork
- SQL 分页存储过程
- Oracle 11g 手动创建数据库 windows下
- Microsoft Visual Studio 2012旗舰版(VS2012中文版下载)官方中文版
- c# GDI+简单绘图(一)