返回指针的函数
2015-03-11 23:56
134 查看
对于最近遇到的一些函数返回指针问题归类总结,希望对各位读者也能有所作用。
首先从一个选择题开始:
int main()
{
char *str = NULL;
char *fun(void);
str = fun();
printf(“%s\n”,str);
return 0;
};
char* fun(void)
{
}
上面的哪个选项是对的,是不是有些眼花缭乱了,基础比较好的很快就判断出来,3,4,5,6,8是正确的,1,2,7是错误的用法
下面一一解释:
1. char str[] = “i love you”;
str是一个char类型数组首地址,程序执行到此处时,字符串“i love you”复制到str指向的存储空间里,属于动态存储,它是存放在栈(statck)空间内,一旦其所在的函数调用结束,那么str的栈空间被释放掉,所以上面code中返回的指针q指向的地址空间已经被释放掉,即变成野指针。
2. char str[] = {‘i’,’ ‘,’l’,’o’,’v’,’e’,’ ‘,’y’,’o’,’u’};
这个跟1的道理相同,只不过1中是用字符串常量赋值,2中是单个字符赋值,但是str指向的存储空间都是在statck空间中,存储方式都一样即动态存储。
3. static char str[] = “i love you”;
这里多了一个static,static在这里的用途是规定str的作用域是其所在的函数内,str数组开辟的空间存储方式是静态存储,该数组变量在程序退出之前会一直存在,所以返回的指针p指向的地址空间会一直存在直到程序退出。
4. static char str[] = {‘i’,’ ‘,’l’,’o’,’v’,’e’,’ ‘,’y’,’o’,’u’};
参考3的解释
5. char *str = “i love you”;
str本身是放在栈区,字符串“i love you”是存放在常量存储区里,该空间直到程序结束才会释放,指针str指向该空间,所以返回的指针p指向的地址空间会一直存在。
6. static char *str = “i love you”;
str本身存放在全局(静态)数据区,同时字符串“i love you”存放在常量存储区,两者都是到程序结束时空间才会释放
7. char str[] = “i love you”;char q = (char )malloc(10 * sizeof(char)); q = str;
这里的定义有点偷梁换柱的意思,写这段code的人本来是返回q指向的空间如果不手动释放会一直存在,但是最后q=str则让q改变了指向,导致结果与1中的作用相同了。
8. char str = (char )malloc(10 * sizeof(char));memcpy(str,”i love you”,10);
str指向的存储空间如果不手动释放会一直存在,所以8正确
经过上面的解释可以总结一下,对于返回指针类型的函数尽量按照下面几种方式来使用
1 使用malloc分配空间
2 使用static变量指针
3 使指针指向常量空间
4 指向全局变量的指针
当然还有二级指针的传递等,有兴趣的读者可以继续研究………
首先从一个选择题开始:
int main()
{
char *str = NULL;
char *fun(void);
str = fun();
printf(“%s\n”,str);
return 0;
};
char* fun(void)
{
1. char str[] = "i love you"; 2. char str[] = {'i',' ','l','o','v','e',' ','y','o','u'}; 3. static char str[] = "i love you"; 4. static char str[] = {'i',' ','l','o','v','e',' ','y','o','u'}; 5. char *str = "i love you"; 6. static char *str = "i love you"; 7. char str[] = "i love you";char *q = (char *)malloc(10 * sizeof(char)); q = str; 8. char *str = (char *)malloc(10 * sizeof(char));memcpy(str,"i love you",10); char *q=str; return q;
}
上面的哪个选项是对的,是不是有些眼花缭乱了,基础比较好的很快就判断出来,3,4,5,6,8是正确的,1,2,7是错误的用法
下面一一解释:
1. char str[] = “i love you”;
str是一个char类型数组首地址,程序执行到此处时,字符串“i love you”复制到str指向的存储空间里,属于动态存储,它是存放在栈(statck)空间内,一旦其所在的函数调用结束,那么str的栈空间被释放掉,所以上面code中返回的指针q指向的地址空间已经被释放掉,即变成野指针。
2. char str[] = {‘i’,’ ‘,’l’,’o’,’v’,’e’,’ ‘,’y’,’o’,’u’};
这个跟1的道理相同,只不过1中是用字符串常量赋值,2中是单个字符赋值,但是str指向的存储空间都是在statck空间中,存储方式都一样即动态存储。
3. static char str[] = “i love you”;
这里多了一个static,static在这里的用途是规定str的作用域是其所在的函数内,str数组开辟的空间存储方式是静态存储,该数组变量在程序退出之前会一直存在,所以返回的指针p指向的地址空间会一直存在直到程序退出。
4. static char str[] = {‘i’,’ ‘,’l’,’o’,’v’,’e’,’ ‘,’y’,’o’,’u’};
参考3的解释
5. char *str = “i love you”;
str本身是放在栈区,字符串“i love you”是存放在常量存储区里,该空间直到程序结束才会释放,指针str指向该空间,所以返回的指针p指向的地址空间会一直存在。
6. static char *str = “i love you”;
str本身存放在全局(静态)数据区,同时字符串“i love you”存放在常量存储区,两者都是到程序结束时空间才会释放
7. char str[] = “i love you”;char q = (char )malloc(10 * sizeof(char)); q = str;
这里的定义有点偷梁换柱的意思,写这段code的人本来是返回q指向的空间如果不手动释放会一直存在,但是最后q=str则让q改变了指向,导致结果与1中的作用相同了。
8. char str = (char )malloc(10 * sizeof(char));memcpy(str,”i love you”,10);
str指向的存储空间如果不手动释放会一直存在,所以8正确
经过上面的解释可以总结一下,对于返回指针类型的函数尽量按照下面几种方式来使用
1 使用malloc分配空间
2 使用static变量指针
3 使指针指向常量空间
4 指向全局变量的指针
当然还有二级指针的传递等,有兴趣的读者可以继续研究………
相关文章推荐
- 返回函数指针的函数
- 返回指针值的函数
- 关于函数指针数组与返回数组指针的函数
- 常成员函数返回指针的类型
- 不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用
- 可以返回函数内部定义的指针
- 使用指针从函数返回一个二维数组
- 使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)
- 函数指针和指针函数(返回指针的函数)
- 三个学生四门课程的问题(返回指针值的函数)
- 函数返回指向自己的指针
- 一个关于函数内部指针参数返回的错误调试及分析
- 函数返回类型为指针的时候的注意事项
- 定义返回函数指针的函数
- 返回指针值的函数
- 什么时候需要删除由函数返回的指针
- 学习回调函数同时引申出用函数参数返回一些值或指针
- STL源码剖析 -- 返回函数指针的函数
- 深入理解C语言中的指向函数的指针和返回指针的函数!
- c 函数指针 和 返回函数指针的函数 的定义方法