先看一个例子:这个程序为什么会崩溃?
#include <stdio.h>
#include <stdlib.h>
int f(int *q)
{
int a = 10;
q = (int*)malloc(sizeof(int));
*q = a;
return 0;
}
int main()
{
int *p = NULL;
f(p);
printf("%d", *p);
return 0;
}
此处的q任然是p的一个拷贝,可以通过这个程序证明:
#include <iostream>
int f(int *q)
{
std::cout << &q << std::endl;
return 0;
}
int main()
{
int a = 10;
int *p = &a;
f(p);
std::cout << &p;
return 0;
}
输出为:
image.png
明指针p与指针q的地址是不同的,证明q是p的一个拷贝。
所以第一个程序崩溃的原因:函数中的q其实是实参p的一份拷贝,函数中的操作都是对q进行的,p仍然是NULL,所以输出*p的值产生崩溃!
可以把形参改为二级指针,程序便可以按预想中的情形进行:
#include <stdio.h>
#include <stdlib.h>
int f(int **q)
{
int a = 10;
*q = (int*)malloc(sizeof(int));
**q = a;
return 0;
}
int main()
{
int *p = NULL;
f(&p);
printf("%d", *p);
return 0;
}
网友评论