子函数中的内存分配(二级指针的应用)

在子函数 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



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值