昨天有同学(初学指针)在练习单链表和二叉树的时候,程序老是崩溃,或者得不到正确结果,于是向我求助。问题就出在指针的参数传递上,没传好指针导致内存混乱,其他代码基本全对。这个错误十分可惜。故在此我想做个记录,可能显得十分基础。
如果函数的参数是普通的一级指针,那么就意味着你只能使用指针、改变指针指向或者改变指向的目标变量。不能试图通过这个指针来申请内存。
void getMemory(int *p)
{
p = (int *)malloc(sizeof(int) * 10);
}
void func()
{
int *num = NULL;
getMemory(num);
// 指针p依旧是NULL指针
}
这是一个非常常见的错误。当发生函数调用的时候,函数的形参总是实参的一个copy(副本),就算是指针也是如此。例如上述的代码可以看成:在调用函数的时候,把num指向的目标地址赋值给p指针。现在num指针和p指针为两个完全不同的实体,它们同时指向了同一个目标地址。通过下面的代码可以验证这个说法。
#include <iostream>
using namespace std;
void getMemory(int *p)
{
printf("target address of pointer p is: %x, its value is: %x\n", p, *p);
printf("but address of pointer p itself is: [%x]\n", &p);
}
int main()
{
int val = 4;
printf("address of val is: %x\n", &val);
int *num = &val;
printf("target address of pointer num is:%x, its value is:%x\n", num, *num);
printf("address of pointer num itself is: [%x]\n", &num);
getMemory(num);
// printf("%d %d %d\n", *p, *(p+1), *(p+2));
getchar();
return 0;
}
这样一来的话,形参上的p指针是一个新的指针,它的指向和原来的num指针一样,所以可以正常的修改目标地址的变量和进行输出。
现在函数中的p指针申请了新的内存,现在就很明显了:它的这个行为和原来的指针没有一点关系,那是p指针自己的事情。