函数内返回字符数组和字符指针的问题
2015-10-15 14:59
288 查看
// 1
#include<stdio.h>
char *arrstr()
{
char arr[]="Hello World !";
return arr;
}
int main()
{
char *str=arrstr();
printf("%s",str);
}
// 2
#include<stdio.h>
char *arrstr()
{
char *p="Hello World !";
return p;
}
int main()
{
char *str=arrstr();
printf("%s",str);
}
结果: 1 输出为乱码 2 输出 Hello World!
1、"hello world!"是一个字符串常量,存放在静态数据区,没错,但是把一个字符串常量赋值给了一个局部变量(char
[]型数组),该局部变量存放在栈中,这样就有两块内容一样的内存,也就是说“
world!”这个字符串在内存中有两份拷贝,一份在动态分配的栈中,另一份在静态存储区。当arrstr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以打印出来的是乱码。
2、把字符串所在静态存储区的首地址赋给指针p , 当函数退出时,字符串常量所占内存不会被收回,所以能够顺利访问访问
#include<stdio.h>
char *arrstr()
{
char arr[]="Hello World !";
return arr;
}
int main()
{
char *str=arrstr();
printf("%s",str);
}
// 2
#include<stdio.h>
char *arrstr()
{
char *p="Hello World !";
return p;
}
int main()
{
char *str=arrstr();
printf("%s",str);
}
结果: 1 输出为乱码 2 输出 Hello World!
1、"hello world!"是一个字符串常量,存放在静态数据区,没错,但是把一个字符串常量赋值给了一个局部变量(char
[]型数组),该局部变量存放在栈中,这样就有两块内容一样的内存,也就是说“
char p[]="hello world!";”这条语句让“hello
world!”这个字符串在内存中有两份拷贝,一份在动态分配的栈中,另一份在静态存储区。当arrstr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以打印出来的是乱码。
2、把字符串所在静态存储区的首地址赋给指针p , 当函数退出时,字符串常量所占内存不会被收回,所以能够顺利访问访问
相关文章推荐
- CSS3多列
- spring 从jsp页面传array数组到后台,自动转化为java的数组类型
- UML九种图
- CASE WHEN 及 SELECT CASE WHEN的用法
- 使用JavaScript+Html创建win8应用(一)
- 黑马程序员——正则及API的使用
- poj 1015 Jury Compromise 01背包+输出方案
- Linux/Windows下 C/C++开发的差异
- Socket 与 WebSocket
- Web前端工程师成长之路——知识汇总
- Review in Incremental Learning
- iOS 基于FFmpeg的移动端Demo:IOS 视频转码器
- java使用siger 轻松获取本机硬件信息(CPU 内存 网络 io等)
- UML类图几种关系的总结
- 京东B2B的4种供销模式
- <iOS>数据缓存
- 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
- HTML页面中<select>
- 提升用户体验的7大微交互
- 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合