指针的指针作用(申请空间)之一
来源:互联网 发布:淘宝一元换购怎么做 编辑:程序博客网 时间:2024/05/01 17:00
以下是经典程序(载自林锐的从c/c++高质量编程),讲解的部分是我个人理解
void GetMemory(char *p,int num){ p=(char*)malloc(sizeof(char)*num); //p是形参指向的地址}void main(){ char *str=NULL; GetMemory(str,100); //str是实参指向的地址,不能通过调用函数来申请内存 strcpy(str,"hello");}
结构是编译能通过,却不能运行,为什么呢?
先说一下指针作为函数参数的意义:当将指针作为参数时,实参向形参传递的是地址,在函数执行过程中,既可以对该参数指针进行处理,也可以对该参数指针所指向的数据进行处理,(以上程序段来说就是可以对p或*p进行处理)。由于此时形参和实参都是指向同一个存储单元,因此当形参指针所指向的数据改变时,实参指针所指向的数据也作相应的改变,因此这时的形参可以作为输出参数使用。
按照上面的说法,这个程序应该没有问题的啊,实参str和形参p指向同一个存储单元,给形参分配的内存单元应该也给实参分配了才对啊,问题就是在这里
实参和形参是指向同一个地址(虽说传递的是指针,但是原指针传递进函数内后生成一个指针的拷贝,此时拷贝指向的地址与原指针相同,函数内新的申请空间地址赋值给拷贝指针后,原指针并没有改变),它们只是指向相同,但它们自身的地址不是同时申请的,就是说p在申请内存时,str并不可以通过调用Getmemory同时申请内存,所以尽管str调用了GetMemory,但它仍然是个空指针,所以进行strcpy是就不能运行。
要使程序可以运行,只要小小的改动就行了(用指向指针的指针):
void GetMemory(char **p,int num){ *p=(char*)malloc(sizeof(char)*num); //此时*p就变成了是形参本身的地址}void main(){ char *str=NULL; GetMemory(&str,100); //&str是实参的地址,所以实参和形参之间就可以直接调用 strcpy(str,"hello"); free(str); }
程序就会如你所愿,输出hello了。
0 0
- (转)指针的指针作用(申请空间)之一
- 指针的指针作用(申请空间)之一
- 指针的指针作用(申请空间)之一
- 指针的指针作用(申请空间)之一
- 指针的指针作用(申请空间)之一
- 指针申请空间
- 指针空间的申请和释放
- 指针空间的申请和释放(C)
- 指针空间的申请与释放
- 指针空间的申请和释放
- 指针的指针作用
- 指针空间的申请和释放自netanimals
- 指针数组(指向指针的指针)空间的释放
- day8-指针数组(二级指针)、内存空间的申请、const
- 字符串指针申请空间,释放测试代码
- 什么是指针以及如何动态申请空间
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- httpd.conf
- PHP保存图片至服务器
- 16位计数器之元件例化的学习
- 布隆过滤器总结(二)原理和例子
- [笔记] 大型网站技术架构——核心原理与案例分析 [七]
- 指针的指针作用(申请空间)之一
- centos查看系统信息
- 数组名取地址 http://www.oschina.net/question/234345_48794?fromerr=KZCzKcSM
- HandlerInterceptor @Autowired报 null
- test
- 腾讯云新购买后的基本配置
- 验证算法
- ThinkPHP项目在SAE下的部署
- C/C++ 之 restrict关键字