子函数中的内存分配(二级指针的应用)
2017-04-19 15:54
323 查看
在子函数 func 中分配一段内存空间
错误例子:
输出结果是:*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无影响,如图
![](https://img-blog.csdn.net/20170419154637013)
分配内存后:
![](https://img-blog.csdn.net/20170419154642810)
在子函数中分配内存时,应该采用二级指针,
*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指针指向的地址
![](https://img-blog.csdn.net/20170419154648370)
分配结束后:
![](https://img-blog.csdn.net/20170419154653654)
除此之外,还可以用子函数返回 分配内存首地址 的方法
输出结果:
*p0 = 5, p0 = 13891963, &p0 = 13891948
malloc success
*p = -51, p = 14529368, &p = 13891720
success
*p0 = -51, p0 = 14529368, &p0 = 13891948
错误例子:
#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
相关文章推荐
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 一级指针与二级指针作函数参数的内存分配
- 一级指针,二级指针在函数调用传址问题。在子函数中分配内存。
- Delphi 的内存操作函数(3): 给结构体指针分配内存
- 类函数指针 分配内存 new()
- 关于子函数给主函数指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- C语言编程基础-16动态内存分配 二级指针做形参 函数指针
- Delphi 的内存操作函数(1): 给字符指针分配内存
- 未分配内存指针作为函数参数问题
- 进程的内存分配函数之brk和mmap(不考虑共享内存)的应用
- linux c二级指针的内存分配和使用
- 二级指针在函数中的应用(读取文件到BYTE*数组中)
- 关于调用子函数给主函数指针分配内存
- 二级指针 分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- 指针在内存分配中的简单应用
- 关于调用子函数给主函数指针分配内存
- 关于调用子函数给主函数指针分配内存
- 程序猿之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程可以分配的内存大小)