C++ char* str与char str[]
2015-08-29 22:24
441 查看
在程序员面试宝典上看到这个两句话:
1、char c[]="hello world"是分配一个局部数组;
2、char *c="hello world"是分配一个全局数组;
最开始还以为是书上说错了,因为自己的理解是这两种方式是等效的。下来查了一下才知道这两种方式的区别。
char* str="hello world ";这个指针指向常量字符串,存储在静态存储区,是只读的,不能被修改。而char str[]="hello world"是一个局部变量数组,存储在栈上的内存空间,可以被修改。
拿程序员面试宝典上的例子来说:
从图中可以看到,在主函数中strA函数,可以正常的输出"hello world"。
而调用strB时,输出则是乱码。
原因在于char* str = "hello world"中定义的str是存储在静态存储区中,具有全局属性,
所以函数结束时,能够正常返回指向存有hello world的内存单元,
而char str[] = "hello world"中的str是存储在栈上的局部变量数组,但函数运行结束时,
会清空栈的存储空间,因此,str2将指向无效的地址空间。因此是乱码。
1、char c[]="hello world"是分配一个局部数组;
2、char *c="hello world"是分配一个全局数组;
最开始还以为是书上说错了,因为自己的理解是这两种方式是等效的。下来查了一下才知道这两种方式的区别。
char* str="hello world ";这个指针指向常量字符串,存储在静态存储区,是只读的,不能被修改。而char str[]="hello world"是一个局部变量数组,存储在栈上的内存空间,可以被修改。
拿程序员面试宝典上的例子来说:
<span style="font-size:18px;">char* strA() { char* str = "hello world"; return str; } char* strB() { char str[] = "hello world"; return str; } int _tmain(int argc, _TCHAR* argv[]) { char* str = strA(); cout << str << endl; char* str2 = strB(); cout << str2 << endl; return 0; }</span>上述代码的输出结果为:
从图中可以看到,在主函数中strA函数,可以正常的输出"hello world"。
而调用strB时,输出则是乱码。
原因在于char* str = "hello world"中定义的str是存储在静态存储区中,具有全局属性,
所以函数结束时,能够正常返回指向存有hello world的内存单元,
而char str[] = "hello world"中的str是存储在栈上的局部变量数组,但函数运行结束时,
会清空栈的存储空间,因此,str2将指向无效的地址空间。因此是乱码。
相关文章推荐
- 为什么把成员函数声明为虚函数
- LeetCode:Invert Binary Tree
- [C++]Kth Smallest Element in a BST 在一个二叉排序树中找第k小的元素
- C模板实现STL容器中的vector
- Rikka with Graph
- C语言贪心算法
- 关于C++中覆盖,重载,隐藏的一点说明
- C++面试问答攻略(转)
- C/C++中extern关键字详解
- c语言中static extern register以及全局变量的细节
- 更新二进制位
- 《Effective C++》读书笔记(二)
- NetAnalyzer笔记 之 三. 用C++做一个抓包程序
- 链表的删除和插入
- 《IOS_C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)
- 有向图深度优先与广度优先算法的C++实现
- 《IOS_C语言》指针
- LeetCode:Summary Ranges
- DEV-C++官方下载地址
- C++11 并发(一道笔试题目)