当前位置:网站首页>【学习笔记之菜Dog学C】动态内存管理之经典笔试题
【学习笔记之菜Dog学C】动态内存管理之经典笔试题
2022-08-05 04:26:00 【姜君竹】
题目一:
- 问题
请问下面这段代码,运行Test 函数会有什么样的结果?
void GetMemory(char* p) {
p = (char*)malloc(100);
}
void Test(void) {
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main() {
Test();
return 0;
}
- 代码分析
str传给GetMemory函数的时候传递的是值,所以GetMemory函数的形参p接收的是一个空指针。GetMemory函数在内部进行动态空间申请,地址存放在p中,并不会影响Test函数中的str。所以str的值依旧是NULL,所以strcpy失败。并且当GetMemory函数运行完之后,形参p销毁,而动态开辟的100个字节内存并没有释放,这样就会导致内存泄露。 - 图解

- 错误更正
char* GetMemory(char* p) {
p = (char*)malloc(100);
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory(str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main() {
Test();
return 0;
}
题目二
- 问题
请问下面这段代码,运行Test 函数会有什么样的结果?
char* GetMemory(void) {
char p[] = "hello world";
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory();
printf(str);
}
int main() {
Test();
return 0;
}
- 代码分析
GetMemory函数内部创建的数组是在栈区上创建的,当函数结束时,这块空间也就销毁了,因此p数组是没有空间的,返回p数组的地址没有实际意义。如果str通过返回的地址去访问内存,就是非法访问。 - 图解

- 错误更正
char* GetMemory(void) {
char* p = (char*)malloc(15);
p = "hello world";
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory();
printf(str);
}
int main() {
Test();
return 0;
}
题目三
- 问题
请问下面这段代码,运行Test 函数会有什么样的结果?
void GetMemory(char** p, int num) {
*p = (char*)malloc(num);
}
void Test(void) {
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
int main() {
Test();
return 0;
}
代码分析
GetMemory函数获取str的地址,然后动态开辟一块空间,把这块空间的地址交给str,最后拷贝“hello”并打印,没有一点问题,但是他没有进行内存释放,会导致内存泄漏。图解

错误更正
void GetMemory(char** p, int num) {
*p = (char*)malloc(num);
}
void Test(void) {
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
free(str);
str = NULL;
}
int main() {
Test();
return 0;
}
题目四
- 问题
请问下面这段代码,运行Test 函数会有什么样的结果?
void Test(void) {
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main() {
Test();
return 0;
}
代码分析
这个代码的问题在于没有把置空,会导致野指针,野指针是非常危险的。当free时,动态开辟的空间已经被释放了,只不过str还记得这块空间的地址,在给这块空间赋值属于是非法访问。图解

错误更正
void Test(void) {
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
str = NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main() {
Test();
return 0;
}
边栏推荐
- mysql数据库表什么字段类型的存储长度最大?
- 炎炎夏日教你利用小米智能家居配件+树莓派4接入Apple HomeKit
- 软件管理rpm
- In the hot summer, teach you to use Xiaomi smart home accessories + Raspberry Pi 4 to connect to Apple HomeKit
- 狗仔队:表面编辑多视点图像处理
- Bytebuffer put flip compact clear method demonstration
- 【背包九讲——01背包问题】
- Qixi Festival code confession
- C语言-大白话理解原码,反码和补码
- [SWPU2019]Web1
猜你喜欢

JeeSite New Report

【测量学】速成汇总——摘录高数帮

bytebuffer use demo

动力小帆船制作方法简单,电动小帆船制作方法

Ali's local life's single-quarter revenue is 10.6 billion, Da Wenyu's revenue is 7.2 billion, and Cainiao's revenue is 12.1 billion

UE4 为子弹蓝图添加声音和粒子效果

UE4 第一人称角色模板 添加冲刺(加速)功能
![[MRCTF2020]PYWebsite](/img/d4/57e8e5ee45b742894679f3f5671516.png)
[MRCTF2020]PYWebsite

Haproxy搭建Web群集

Detailed explanation of Mysql's undo log
随机推荐
日志导致线程Block的这些坑,你不得不防
dedecms后台生成提示读取频道信息失败的解决方法
商业智能BI业务分析思维:现金流量风控分析(一)营运资金风险
8.04 Day35-----MVC three-tier architecture
Qixi Festival earn badges
JeeSite新建报表
【测量学】速成汇总——摘录高数帮
upload上传图片到腾讯云,如何上传图片
UE4 opens door via interaction (keyboard key)
How to wrap markdown - md file
35岁的软件测试工程师,月薪不足2W,辞职又怕找不到工作,该何去何从?
Application status of digital twin technology in power system
[MRCTF2020]PYWebsite
【informix】解决启动报错大全,以及解决办法
Homework 8.4 Interprocess Communication Pipes and Signals
dedecms织梦tag标签不支持大写字母修复
ansible各个模块详解
Day019 方法重写与相关类的介绍
大学物理---质点运动学
关于#SQL#的迭代、父子结构查询问题,如何解决?