重新开始战斗22-程序员面试宝典-P66_7.2面试题3--局部数组和全局数组问题
2014-04-03 16:24
387 查看
问题描述:
这个函数有什么问题
Char *strA()
{
Charstr[] = “hello world”;
Returnstr;
}
这个函数是存在风险的,如果要利用这个函数,例如:
Char *p = strA()
调用这个函数的意图是希望p指向“hello world”这个字符串,但是注意这条语句,Char str[] = “hello world”;,这里是说str是个局部数组,因此,当这个函数执行完成后,系统会回收局部变量,也就是说str数组会被销毁。销毁后,那么p又指向什么呢?所以说有风险。
改进:
Const Char *strA()
{
Char*str = “hello world”;
Returnstr;
}
有两个改进,先谈谈函数体里面的改动,为什么要将str[]改为*str,如果为Char str[] = “hello world”;则为局部数组,函数执行完成后,整个数组将会被回收,如果为Char* str = “hello world”;这里*str依然为局部变量,但是,“helloworld”不在随str的销毁而销毁,因为,“hello world”不是指针的一部分,也不是数组,而是一个常量字符串,常量字符串当然不是在堆栈中存储,它保存在只读的数据段中,因此,函数执行完成后,str的回收将不会回收“hello
world”。
再者,根据上面的分析,就能理解加上const限定符的原因了,因为str指向的是一个常字符串,因此不应该对其进行修改,所以加上const限定符。
这个函数有什么问题
Char *strA()
{
Charstr[] = “hello world”;
Returnstr;
}
这个函数是存在风险的,如果要利用这个函数,例如:
Char *p = strA()
调用这个函数的意图是希望p指向“hello world”这个字符串,但是注意这条语句,Char str[] = “hello world”;,这里是说str是个局部数组,因此,当这个函数执行完成后,系统会回收局部变量,也就是说str数组会被销毁。销毁后,那么p又指向什么呢?所以说有风险。
改进:
Const Char *strA()
{
Char*str = “hello world”;
Returnstr;
}
有两个改进,先谈谈函数体里面的改动,为什么要将str[]改为*str,如果为Char str[] = “hello world”;则为局部数组,函数执行完成后,整个数组将会被回收,如果为Char* str = “hello world”;这里*str依然为局部变量,但是,“helloworld”不在随str的销毁而销毁,因为,“hello world”不是指针的一部分,也不是数组,而是一个常量字符串,常量字符串当然不是在堆栈中存储,它保存在只读的数据段中,因此,函数执行完成后,str的回收将不会回收“hello
world”。
再者,根据上面的分析,就能理解加上const限定符的原因了,因为str指向的是一个常字符串,因此不应该对其进行修改,所以加上const限定符。
相关文章推荐
- 2011年10月10日16:22:36百度面试题目汇总☆参考答案随后补充☆
- BaiDu往年面试题目汇总☆WM☆
- 重新开始战斗21-程序员面试宝典-P40_5.6面试2--两数交换问题
- iOS程序员如何面试
- [面试题] 两个单链表里交叉的第一个元素
- 重新开始战斗20-程序员面试宝典-P39_5.5面试题2--求平均数
- 重新开始战斗19-程序员面试宝典-P34_5.4面试题2--数据转换与指针转换
- 黑马程序员 _10 OC基础 block 协议 代理
- 黑马程序员——封装,继承与多态
- 黑马程序员 _8 OC基础 id description sel的使用
- 黑马程序员----流程控制与方法
- 黑马程序员 _9 OC基础 内存管理
- 黑马程序员----反射
- 黑马程序员----IO操作
- 黑马程序员——对象
- 黑马程序员----面试题之交通管理系统
- java面试题收集
- 好程序员和差程序员
- 面试题收集——Java基础部分(一)
- ios 面试题(1)