C++中按值调用中的几个比较好玩的问题
2017-03-13 21:03
363 查看
一般而言对于有指针基础的人来说,对于那些传递变量的值给函数,而函数内部又无法改变该变量的值,一般的解决方法就是使用指针,把变量的地址传入函数就可以改变原函数的值。
下面我们来看几个比较有趣的问题
1.参数是指针,但是却报错了:
这里可以看到传入的确实是指针,但是还是报错了,这是怎么回事呢?
首先,这里的还是牵涉到传入函数的实际上只是值,只是这里牵涉到的传入的是指针的值,改变是是指针的值。
我们给str赋的初值是NULL,可是在函数中,我们想改变的是指针str的值,而实际上在函数调用的时候传入的只是指针的str的值,并不是指针str自己,我们的解决方法很简单,有两种:
第一种:
我们可以使用二级指针来解决问题
第二种:我们可以让函数返回一个char *的值,然后用str来接受这个返回值,同样可以达到相同的效果
2.我们一般函数的返回值是可以直接使用的,可是牵涉到指针,我们会发现一个好玩的现象
返回的明明是数组的p[]的值啊!
可是一般我们输出的却是乱码,这是为什么呢?
其实是因为函数传回的是p[]数组的首地址不错,
但是在函数调用完后数组p[]的值会被释放掉,也就是当函数调用结束后数组p[]里储存的不再是hello world了,而是未知数。
3.野指针的情况
这个程序一运行发现
哇,结果是对的,但是这是很危险的一个行为,在前面我们已经把str释放掉了,结果下面有使用str,这就出现的使用野指针的情况,虽然你的运行是正确的,但是如果是一个长时间运行的软件,你会发现程序有时候莫名奇妙的崩溃了,而且还找不出问题,这可能就是这种原因,
所以建议在释放掉指针的内存后要令指针str为NULL,这样才安全一点。
下面我们来看几个比较有趣的问题
1.参数是指针,但是却报错了:
#include <iostream> using namespace std; void GetMemory(char *p); int main() { char *str = NULL; GetMemory(str); strcpy(str, "Hello world"); cout << str << endl; return 0; } void GetMemory(char *p) { p = (char *)malloc(100); }
这里可以看到传入的确实是指针,但是还是报错了,这是怎么回事呢?
首先,这里的还是牵涉到传入函数的实际上只是值,只是这里牵涉到的传入的是指针的值,改变是是指针的值。
我们给str赋的初值是NULL,可是在函数中,我们想改变的是指针str的值,而实际上在函数调用的时候传入的只是指针的str的值,并不是指针str自己,我们的解决方法很简单,有两种:
第一种:
#include <iostream> using namespace std; void GetMemory(char **p); int main() { char *str = NULL; GetMemory(&str); strcpy(str, "Hello world"); cout << str << endl; return 0; } void GetMemory(char **p) { *p = (char *)malloc(100); }
我们可以使用二级指针来解决问题
第二种:我们可以让函数返回一个char *的值,然后用str来接受这个返回值,同样可以达到相同的效果
2.我们一般函数的返回值是可以直接使用的,可是牵涉到指针,我们会发现一个好玩的现象
#include <iostream> using namespace std; char *GetMemory(); int main() { char *str = NULL; str = GetMemory(); cout << str << endl; return 0; } char *GetMemory() { char p[] = "hello world"; return p; }
返回的明明是数组的p[]的值啊!
可是一般我们输出的却是乱码,这是为什么呢?
其实是因为函数传回的是p[]数组的首地址不错,
但是在函数调用完后数组p[]的值会被释放掉,也就是当函数调用结束后数组p[]里储存的不再是hello world了,而是未知数。
3.野指针的情况
#include <iostream> using namespace std; int main() b8d8 { char *str = (char *)malloc(100); strcpy(str, "hello"); free(str); if (str != NULL) { strcpy(str, "world"); cout << str << endl; } return 0; }
这个程序一运行发现
哇,结果是对的,但是这是很危险的一个行为,在前面我们已经把str释放掉了,结果下面有使用str,这就出现的使用野指针的情况,虽然你的运行是正确的,但是如果是一个长时间运行的软件,你会发现程序有时候莫名奇妙的崩溃了,而且还找不出问题,这可能就是这种原因,
所以建议在释放掉指针的内存后要令指针str为NULL,这样才安全一点。
相关文章推荐
- C++中几个比较不常用的关键字
- C++中几个比较不常用的关键字(转)
- C++中几个比较不常用的关键字
- 比较Java和C++的几个修饰符
- C++老手也要注意的几个"小"问题
- c#调用API 和c++dll的参数问题
- 从C++到C#,我遇到的几个问题
- 如何有效解决C与C++的相互调用问题
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- 从C++到C#,我遇到的几个问题
- C++调用C函数问题
- JBoss RMI 远程调用需要注意的几个问题!
- VC++.NET 2005 几个比较难缠的问题及其解决方法
- C++笔试题 关于函数析构函数未调用的问题
- 从C++到C#,我遇到的几个问题
- C++中几个比较不常用的关键字
- 关于C#和C++的重载(Overload)、隐藏(Hide)、覆盖(Override)几个区别比较和得出的疑问
- JBoss RMI 远程调用需要注意的几个问题!
- 非托管C++调用 Webservice,如何解决状态保持的问题
- 从C++到C#,我遇到的几个问题