指针的指针作用(申请空间)之一
以下是经典程序(载自林锐的从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了。
指针的指针作用(申请空间)之一相关推荐
- 什么是指针以及如何动态申请空间
int a;int *p;第一个比较熟悉,就是定义一个整型变量.第二个就是定义了一个整型指针变量p: 1.指针有什么作用? 指针是存储一个地址!注意是地址,不是什么具体的数值. 2.指针如何才能存储变 ...
- 结构指针的坑之(定义结构体指针时并没有分配存储空间,所以要用malloc()申请空间)
这段代码会报错,核心转储 #include<stdio.h> #include <string.h>struct role // 定义一个结构体 { // char name[ ...
- 走进C++程序世界-----指针(动态申请空间和释放空间)
使用关键字NEW分配内存 在讲解分配内存之前,首先来理解下内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区这些也是初学者容易混淆的地方.我的博客中有一篇文章描述C语言中代码分配情况,点击链 ...
- c语言给结构体指针申请空间,结构体中的指针变量申请空间问题
本人声明了一个结构体包含id,age,name三个属性 struct studentInfo { int id; int age; char *name[20]; }; 本人又创建了一个双向循环链表, ...
- 为什么使用指针变量时一定要申请空间?
摘要:本文主要探究一个问题:为什么使用指针变量时一定要申请空间? 1.问题的提出: 我们在使用指针时,有时需要用指针指向一个变量,用指针来对变量进行操作:而有时我们就需要直接定义一个指针变量,然后用指 ...
- 关于c/c++里面结构体指针变量的申请空间问题。
这个问题是我在2020年刚开始学数据结构链表那一章遇到的,当时应该也没完全理解透彻,然后最近又遇到了,重新了解了一下.感觉网上许多人说的也未必正确,所以跟大家讲讲我的看法. 先得有两个知识前提: 1. ...
- C++阶段01笔记07【指针(基本概念、变量定义和使用、内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数)】
C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 7 指针 7.1 指针的基本概念 7.2 指针变量的定义和使用 示例 7.3 指针所占内存空间 示例 7.4 空指针和野指针 示 ...
- “指向指针的指针”的作用和应用
结合http://blog.csdn.net/oqqhutu12345678/article/details/60963087来看. 结合http://blog.csdn.net/oqqhutu123 ...
- 指针作用、指针与指针变量、指针的定义与初始化、指针赋值
目录 一.指针的作用 二.指针与指针变量 1.变量的地址 2.指针与指针变量的概念 三.指针的定义与初始化 1.指针的定义 2.直接访问与间接访问 3.指针的初始化 四.取地址与指针运算符及指针赋值运 ...
最新文章
- MySQL count sum 条件查询
- 代码整洁之道(一)最佳实践小结
- 前端学习(2744):重读vue电商网站54之配置 HTTPS 服务
- VSCode配置PyQt5和designer
- python 包的使用 (四)——Seaborn绘图
- 当后台返回的图片在前端加载不出来时,前端做默认图片展示
- 系统动力学学习笔记一
- XML基础复习[整理][转载]
- ThinkPHP3.1.3 { Fast Simple OOP PHP Framework } — [ WE CAN DO IT JUST THINK ] 报错解决办法。...
- 叮咚~您的新年礼物到啦,请查收:虎来喽----Python打造虎年祝福神器
- 自我实现者共同的性格特征
- android 低电量卡,Android11 增加低电量通知
- php本地安装mysql报错443_Mysql性能剖析工具--Anemometer部署
- linux双系统没有引导,Ubuntu双系统没有可引导设备如何解决
- javascript检查移动设备是否支持重力方向感应
- 爱彼迎超赞房东分享打造五星好评民宿的七个运营秘诀
- AutoHotkey实现大部分窗口隐藏标题栏,顺便透明些
- Linux应用开发【第二章】图像处理应用开发
- Eclipse安装插件后手动删除依赖无法再次安装插件
- 模具设计作为一门以经验为重要基础的学问