以下是经典程序(载自林锐的从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了。

指针的指针作用(申请空间)之一相关推荐

  1. 什么是指针以及如何动态申请空间

    int a;int *p;第一个比较熟悉,就是定义一个整型变量.第二个就是定义了一个整型指针变量p: 1.指针有什么作用? 指针是存储一个地址!注意是地址,不是什么具体的数值. 2.指针如何才能存储变 ...

  2. 结构指针的坑之(定义结构体指针时并没有分配存储空间,所以要用malloc()申请空间)

    这段代码会报错,核心转储 #include<stdio.h> #include <string.h>struct role // 定义一个结构体 { // char name[ ...

  3. 走进C++程序世界-----指针(动态申请空间和释放空间)

    使用关键字NEW分配内存 在讲解分配内存之前,首先来理解下内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区这些也是初学者容易混淆的地方.我的博客中有一篇文章描述C语言中代码分配情况,点击链 ...

  4. c语言给结构体指针申请空间,结构体中的指针变量申请空间问题

    本人声明了一个结构体包含id,age,name三个属性 struct studentInfo { int id; int age; char *name[20]; }; 本人又创建了一个双向循环链表, ...

  5. 为什么使用指针变量时一定要申请空间?

    摘要:本文主要探究一个问题:为什么使用指针变量时一定要申请空间? 1.问题的提出: 我们在使用指针时,有时需要用指针指向一个变量,用指针来对变量进行操作:而有时我们就需要直接定义一个指针变量,然后用指 ...

  6. 关于c/c++里面结构体指针变量的申请空间问题。

    这个问题是我在2020年刚开始学数据结构链表那一章遇到的,当时应该也没完全理解透彻,然后最近又遇到了,重新了解了一下.感觉网上许多人说的也未必正确,所以跟大家讲讲我的看法. 先得有两个知识前提: 1. ...

  7. C++阶段01笔记07【指针(基本概念、变量定义和使用、内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 7 指针 7.1 指针的基本概念 7.2 指针变量的定义和使用 示例 7.3 指针所占内存空间 示例 7.4 空指针和野指针 示 ...

  8. “指向指针的指针”的作用和应用

    结合http://blog.csdn.net/oqqhutu12345678/article/details/60963087来看. 结合http://blog.csdn.net/oqqhutu123 ...

  9. 指针作用、指针与指针变量、指针的定义与初始化、指针赋值

    目录 一.指针的作用 二.指针与指针变量 1.变量的地址 2.指针与指针变量的概念 三.指针的定义与初始化 1.指针的定义 2.直接访问与间接访问 3.指针的初始化 四.取地址与指针运算符及指针赋值运 ...

最新文章

  1. MySQL count sum 条件查询
  2. 代码整洁之道(一)最佳实践小结
  3. 前端学习(2744):重读vue电商网站54之配置 HTTPS 服务
  4. VSCode配置PyQt5和designer
  5. python 包的使用 (四)——Seaborn绘图
  6. 当后台返回的图片在前端加载不出来时,前端做默认图片展示
  7. 系统动力学学习笔记一
  8. XML基础复习[整理][转载]
  9. ThinkPHP3.1.3 { Fast Simple OOP PHP Framework } — [ WE CAN DO IT JUST THINK ] 报错解决办法。...
  10. 叮咚~您的新年礼物到啦,请查收:虎来喽----Python打造虎年祝福神器
  11. 自我实现者共同的性格特征
  12. android 低电量卡,Android11 增加低电量通知
  13. php本地安装mysql报错443_Mysql性能剖析工具--Anemometer部署
  14. linux双系统没有引导,Ubuntu双系统没有可引导设备如何解决
  15. javascript检查移动设备是否支持重力方向感应
  16. 爱彼迎超赞房东分享打造五星好评民宿的七个运营秘诀
  17. AutoHotkey实现大部分窗口隐藏标题栏,顺便透明些
  18. Linux应用开发【第二章】图像处理应用开发
  19. Eclipse安装插件后手动删除依赖无法再次安装插件
  20. 模具设计作为一门以经验为重要基础的学问

热门文章

  1. 未来计算机会朝什么方向发展,计算机更新换代非常快,未来计算机会向哪些方向发展...
  2. 10年前的《武林外传》
  3. 电脑外接显示屏导致屏幕翻转不回来解决办法
  4. 快速辨别水货手机的方法
  5. gcc g++ 参数介绍
  6. arduino如何在ssd1306上显示中文字符
  7. 酷狗音乐逐字匹配歌词是如何做到的
  8. IDEA MAVEN工具栏简介
  9. [附源码]计算机毕业设计springboot基于Java的日用品在线电商平台
  10. 创始人专访 | Kimi:因为自己淋过雨,所以总想给别人撑把伞