您的位置:首页 > 其它

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

2017-04-19 15:54 323 查看
在子函数 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐