当前位置: 首页 > news >正文

C语言笔试题(1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,“hello world”);
}
int main(void)
{
char *str=NULL;
getmemory(str);
printf(“%s/n”,str);
free(str);
return 0;
}
上述程序执行后会出现什么问题?
答:
问题所在:(我的理解)原题中str是个空指针,getmemory函数把str的NULL这个值赋给了形参p,p是一个区别于str的另一个字符指针,函数中执行malloc函数在堆中动态分配了100字节内存,malloc函数最后return了100字节的首地址,并将这首地址强制转换为char 类型赋值给了形参p,strcpy函数将字符串常量“hello world”复制给了p所指向的字符串(区别于p=“hello world”,如果用这个替代strcpy这行代码则原理是“hello world”的首地址赋值给了p)。str的值依然没有改变,p和str是两个变量,互不干扰,唯一相关的就是str的值复制给了p。所以若printf(“%s/n”,str),str仍是NULL,所以打印str为空。对于free(str),free一个空指针对内存来说没有任何影响,这是允许的,也没任何害。但是,在getmemory函数里动态分配的内存未释放掉,将会导致内存泄漏,又没办法把这段内存找回来,虽然形参p里存储这段内存的首地址,但他是形参,是函数里定义的变量,存放于栈中,在函数执行完就被释放掉了,所以没有人知道动态分配的这段内存在哪儿,唯一与这段内存有关系的p不存在了。
解决办法:根本原因是形参p和str为两个不同变量,只需将str的地址赋值给形参p,这样
p就是真正的str本体,后续的操作也就有效,不会存在内存泄漏,动态分配的内存也正常被释放掉。

http://www.lryc.cn/news/38783.html

相关文章:

  • 网络连接的三种模式
  • 大学模拟电路期末考试模拟题详解
  • C/C++内存管理讲解
  • 【Linux】网络原理
  • list模拟实现
  • CSS看这一篇就够啦,CSS基础大全,可用于快速回顾知识,面试首选
  • Canvas详细使用方法(一)
  • CentOS定时任务——crontab
  • C51---蓝牙模块---连接软件---控制LED灯
  • Linux 学习笔记——二、主机规划与磁盘分区
  • 麒麟服务器V10 版本 安装 Anaconda教程,也就是安装Python环境的教程(亲测有效)
  • 【3维视觉】网格细分Mesh Subdivision算法介绍(Loop, Catmull-Clark, Doo-Sabin)
  • 自学大数据第六天~HDFS命令
  • maven仓库的配置
  • 医院信息管理云平台源码 云HIS系统源码 4级电子病历系统
  • JS学习第9天——ES6中面向对象(类class、constructor构造函数、类的继承extends、super关键字、面向对象tab栏切换案例)
  • K8S核心秘术学习总纲
  • 【PTA-训练day27】L2-038 病毒溯源 + L2-039 清点代码库 + L2-040 哲哲打游戏
  • 新一代跨平台云备份工具Duplicacy
  • 考研复试——概率论
  • Web学习4_JavaScript常用库
  • C++回顾(二十)—— vector容器 和 deque容器
  • httpd使用记录
  • .vue 组件打包成 .js
  • Java 代码分享(第11篇)编程解决数学问题:“计算3个10以内的数字,与合计值相除后,商的第3位小数大于4,共有多少个数的组合满足条件”类似问题
  • 面试题 17.05. 字母与数字
  • 解决Win10图片/文件右键单击自动退出并刷新桌面问题
  • 【代码随想录训练营】【Day39】第九章|动态规划|62.不同路径|63. 不同路径 II
  • 【Linux】linux | 修改系统编码 |  增加字体处理 | 图片处理字体变成方块
  • R语言介绍及安装教程