最近看面试题,遇到一些关于通过函数改变一个变量的值得问题,现在终结一下:

先看下面一段代码:

#include <stdio.h>
#include <stdlib.h>void GetMemory(char *p)
{p=(char*)malloc(100);
}void Test(void)
{char *str=NULL;GetMemory(str);strcpy(str,"hello world");
    printf("%s\n",str);
}

运行结果:段错误

错误原因分析:str 是一个指针变量,传入GetMemory(str);的只是str的一个拷贝,所以str 的值没有改变,一直是NULL。而调用strcpy() 后,访问了非法的内存,所以产生段错误。

注意:由于GetMemory();中动态申请的内存没有释放,所以会造成内存泄漏

解决办法如下:

使用二级指针

#include <stdio.h>
#include <stdlib.h>void GetMemory(char **p)
{*p=(char*)malloc(num);
}void Test(void)
{char  *str=NULL;GetMemory(&str);strcpy(str,"hello world");printf("%s\n",str);
}

分析:由于传入的是一个指向 指针(str)的指针,也就是二级指针,所以可以通过这个二级指针来改变str (指针变量)的值,所以str的值会被改变。

缺点:用完没有及时释放内存,会造成内存泄漏。

总结:

1. 形参只是外部一个变量的拷贝,而且是单向传递的,改变形参不会对实参造成影响。

2. 要想通过函数改变一个变量的值,需要通过指针来完成,比如:改变一个int 型变量的值,需要传入的形参为指向int 变量的指针。要改变一个一级指针的指向(指针变量的值),需要传入的形参为二级指针。因为指针本身也可以是个变量。

C语言中,如何通过函数来改变一个变量的值相关推荐

  1. php true to 1,PHP语言中,______函数能检测一个变量是否存在,返回true表示变量存在,false表示变量不存在;______函数可以删除一个指定的变量,没有返回值。...

    [单选题]A comparison of traditional pedagogy and language use in real life in ______ . [单选题]下颌下腺 [判断题]双 ...

  2. main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...

    PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...

  3. python全局变量可以改变吗_在Python中避免我的全局变量,我有几个函数可以改变一个变量...

    我试图摆脱我的全局变量,但我不是成功的. 在这种情况下,我让用户在运行程序时分配坐标.从这些坐标开始,我们开始驾驶一艘船(在矩阵内),这意味着我控制运动的功能需要从输入功能访问这些坐标.移动功能还需要 ...

  4. 全局变量中断原子操作_中断函数里改变一个全局变量的值,在主函数里却检测到未变化...

    如题.下面是我的程序代码 /****************************************************************** 键盘扫描函数 使用CPU资源:PORT ...

  5. c语言中函数形参值改变了,相应的实参值是否改变,C语言中,如何利用函数和指针变量通过形参变量的值改变实参变量的值...

    必备知识:c语言中的函数调用和指针变量的相关知识 众所周知,函数是C语言中一个十分重要的模块,因为函数的存在,使得C语言的可读性.可维护性.可移植性大大提高.因此,想要学好C语言,必须要学好函数.函数 ...

  6. C语言中的sprint函数,求sprintf函数的详解

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:求sprintf函数的详解,要附带例,粘贴来的也可以,只 问题详情:还有就是我还想要一些常用的宽度修饰之类的输入或者输出格式:回答: ...

  7. c语言fputc 函数头,简单对比C语言中的fputs()函数和fputc()函数

    简单对比C语言中的fputs()函数和fputc()函数 C语言fputc()函数:写文件函数(将一指定字符写入文件流中) 头文件: #include 定义函数: int fputc(int c, F ...

  8. c语言中rand()的作用,c语言中的rand()函数用法

    rand() rand()函数作用:用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()函数返回:返回一个范围在 ...

  9. c语言中的printf函数_C语言中的printf()函数与示例

    c语言中的printf函数 C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <s ...

最新文章

  1. hrbustoj 2283 heap解题报告
  2. H5移动页面的touch事件与点击穿透问题
  3. 周二直播丨Oracle数据库SQL执行计划的取得和解析
  4. 更快学习 JavaScript的6个思维技巧
  5. TTButton 的正确使用的方法
  6. 关于【CDQ分治】的学习
  7. Vulkan环境搭建的详细方法(for Windows)
  8. jsp 默认select option 默认选中方法
  9. mysql数据导出insert_mysql 数据导出
  10. 原来大家最拼命的时候是这样子的
  11. 如何批量打印PDF文件
  12. BatchConfigTool批量配置工具
  13. 惊艳!ftrack和UE4,强强联合!
  14. python复数计算符号_Python:基本运算、基本函数(包括复数)、Math模块、NumPy模块...
  15. 微信多开服务器,PC端微信多开
  16. 单光感pid巡线_技术解析——单颜色传感器巡线中的PID控制器
  17. 网页平面设计/广州平面UI设计培训就业班课程
  18. Echarts3 使用详解
  19. 丁磊进退之道《前程密码》
  20. Doris(20):Doris的函数—数学函数

热门文章

  1. 计算机维护岗位运用到的知识,计算机机房管理和维护措施
  2. 九阳破壁机轴承坏只能换刀片总成组件
  3. php百家号爬虫,百家号爆文采集
  4. Flash Builder4注册机
  5. ip信誉_谁得到信誉?
  6. 635头脑风暴创意法
  7. Java返回树形结构的数据 (children方式)
  8. 《道德经》第二十一章
  9. android充值金币功能,运营人员必读:手机游戏充值流程及问题详解
  10. 百兆局域网千兆升级方案