函数的返回值,必须保证在使用时,他所对应的变量值不应被销毁。防止变量被销毁的方式:
1.定义全局变量;
2.定义静态变量;
3.在堆区定义变量;
4.定义在常量区,如字符串常量。
注:静态全局变量只在当前文件中可用,全局变量在其他文件中也可用,需要用extern声明;二者如果没有手动初始化,则默认由编译器初始化为0。
具体分析:
例1:
char* func()
{
char *p = "test"; //字符串常量,存储于常量区,退出时不受影响
return p; // 返回指向常量字符串的指针,可行
}
例2:
char* func()
{
char str[] = "test"; //字符串局部变量,退出时销毁
return str; // 返回局部字符串的指针,将引发未知错误
}
解决办法就是将字符串str声明为static或在堆内定义变量,如例3。
例3:
char* func()
{
char *str = (char *)malloc(sizeof(char) * BUFFER_SIZE);
strcpy(str, "test");
return str;
}
需要注意的问题是防止出现内存泄露,函数调用完后需要手动释放内存,free(temp);
例4:
int* Count(char *s)
{
int count[100]={1,2,3};//局部变量
return count;
}
当把数组名返回时,实际上是返回了数组的首地址,后续继续使用该地址指向的内存。如果数组为局部变量,该段地址在退出函数后,会被释放,并可能被系统做其它用途,这样再继续访问该段地址就会引起不可预知错误。所以对于局部数组名是不可以返回的。
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复