您的位置:首页 > 编程语言 > C语言/C++

C++中按值调用中的几个比较好玩的问题

2017-03-13 21:03 363 查看
一般而言对于有指针基础的人来说,对于那些传递变量的值给函数,而函数内部又无法改变该变量的值,一般的解决方法就是使用指针,把变量的地址传入函数就可以改变原函数的值。

下面我们来看几个比较有趣的问题

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,这样才安全一点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: