在子函数 func 中分配一段内存空间
错误例子:
#include <iostream>
using namespace std;
void func(char *p)
{
printf("*p = %d, p = %d, &p = %d\n", *p, p, &p);
if (NULL == (p = (char*)malloc(sizeof(char))))
{
cout << "malloc fail" << endl;
return false;
}
cout << "malloc success" << endl;
printf("*p = %d, p = %d, &p = %d\n", *p, p, &p);
return true;
}
int main()
{
char a = 5;
char *p0 = &a;
printf("*p0 = %d, p0 = %d, &p0 = %d\n", *p0, p0, &p0);
func(p0);
if (p0 != &a)
cout << "success" << endl;
else
cout << "fail" << endl;
printf("*p0 = %d, p0 = %d, &p0 = %d\n", *p0, p0, &p0);
return 0;
}
输出结果是:*p0 = 5, p0 = 10091415, &p0 = 10091400
*p = 5, p = 10091415, &p = 10091188
malloc success
*p = -51, p = 16047184, &p = 10091188
fail
*p0 = 5, p0 = 10091415, &p0 = 10091400
我们知道,char*p是一级指针,其值为char类型的地址,上述代码中形参p指针指向a的地址,
p指向 a 的地址,修改 p指向的地址 对p0无影响,如图
分配内存后:
在子函数中分配内存时,应该采用二级指针,
#include <iostream>
using namespace std;
void func(char **p)
{
printf("**p = %d, *p = %d, p = %d\n", **p, *p, p);
if (NULL == (*p = (char*)malloc(sizeof(char))))
{
cout << "malloc fail" << endl;
return false;
}
cout << "malloc success" << endl;
printf("**p = %d, *p = %d, p = %d, &p = %d\n", **p, *p, p, &p);
return true;
}
int main()
{
char a = 5;
char *p0 = &a;
printf("*p0 = %d, p0 = %d, &p0 = %d\n", *p0, p0, &p0);
func(&p0);
if (p0 != &a)
cout << "success" << endl;
else
cout << "fail" << endl;
printf("*p0 = %d, p0 = %d, &p0 = %d\n", *p0, p0, &p0);
return 0;
}
输出结果:
*p0 = 5, p0 = 5240687, &p0 = 5240672
**p = 5, *p = 5240687, p = 5240672, &p = 5240460
malloc success
**p = -51, *p = 8642424 , p = 5240672, &p = 5240460
success
*p0 = -51, p0 = 8642424, &p0 = 5240672
上述代码修改了三个地方
1,func函数传入的参数由 p0 修改为 &p0
2,func函数的形参由 *p 修改为 **p
2,将分配好的内存首地址赋值给 *p 而不是 p
我们知道 char**p 是二级指针,其值为char类型指针的地址,上述代码形参 p 指向 &p0 (p0指针的地址)
p 指向 p0指针的地址,*p 指向 p0指针指向的地址,修改*p 相当于 修改 p0指针指向的地址
分配结束后:
除此之外,还可以用子函数返回 分配内存首地址 的方法
#include <iostream>
using namespace std;
char* func()
{
char *p;
if (NULL == (p = (char*)malloc(sizeof(char))))
{
cout << "malloc fail" << endl;
return false;
}
cout << "malloc success" << endl;
printf("*p = %d, p = %d, &p = %d\n", *p, p, &p);
return p;
}
int main()
{
char a = 5;
char *p0 = &a;
printf("*p0 = %d, p0 = %d, &p0 = %d\n", *p0, p0, &p0);
p0 = func();
if (p0 != &a)
cout << "success" << endl;
else
cout << "fail" << endl;
printf("*p0 = %d, p0 = %d, &p0 = %d\n", *p0, p0, &p0);
return 0;
}
输出结果:
*p0 = 5, p0 = 13891963, &p0 = 13891948
malloc success
*p = -51, p = 14529368, &p = 13891720
success
*p0 = -51, p0 = 14529368, &p0 = 13891948