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

E37.【C语言】动态内存管理练习题

目录

1.

答案速查

分析

源代码分析

反汇编代码分析(底层)

2.

答案速查

分析

3.

答案速查

分析

VS逐步调试


1.

求下列代码的执行结果

#include <stdio.h>
char* GetMemory(void)
{
	char p[] = "hello world";
	return p;
}

void Test(void)
{
	char* str = NULL;
	str = GetMemory();
	printf(str);
}

int main()
{
	Test();
	return 0;
}

答案速查

乱码

分别是x86+debug和x64+debug下的运行结果

分析

源代码分析

GetMemory函数的p返回后,函数退出,栈空间(本题的hello world)会被销毁,交还操作系统,由操作系统来处理

此时printf(str);没有作用,str指向的hello world已经不存在,相当于str为野指针

反汇编代码分析(底层)

会单开一篇文章分析

2.

求下列代码的执行结果

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}

答案速查

分析

虽然能成功打印,但是有两处不规范的地方

1.malloc函数的返回值没有判断是否为空指针

2.有malloc但没有free,容易发生内存泄漏

具体分析和改法类似71.【C语言】动态内存管理(重点)(4)

3.

求下列代码的执行结果

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}

答案速查

分析

一个很明显不规范的地方

	strcpy(str, "hello");
	free(str);
	if (str != NULL)

备注:"hello"字符串 实际上在末尾有一个\0

VS报警告:

free后没有为str置为NULL(注:free函数不会自动为str置为NULL),导致str为野指针

使(str != NULL)成立,导致非法访问(strcpy(str, "world"); printf(str);)

VS逐步调试

free函数执行完后,被VS写入dd字符数组


http://www.kler.cn/news/337603.html

相关文章:

  • 怎么录制视频?10款免费视频录制软件大推荐
  • ROS无人机机械爪使用
  • 代数结构基础 - 离散数学系列(八)
  • 【C语言】分支和循环(3)
  • 窗口系统与图形绘制接口
  • 学习threejs,模拟窗户光源
  • 第 1 章 MyBatis快速入门
  • 零样本提示ChatGPT
  • 初始操作系统篇(1)—— 操作系统的概念与分类
  • docker部署禅道使用内置mysql
  • 网络基础:TCP/IP五层模型、数据在局域网传输和跨网络传输的基本流程、IP地址与MAC地址的简单解析
  • BJFU|数据结构A(22下)实验2(2)——严蔚敏版教材头歌系统
  • 【编程基础知识】掌握Spring MVC:从入门到精通
  • C++ WebDriver扩展
  • C++中stack和queue的模拟实现
  • PostgreSQL常用数值处理函数简介
  • 【Docker从入门到进阶】01.介绍 02.基础使用
  • 【python实操】python小程序之魔法方法(__init__方法、__str__方法、__del__方法)
  • 【rust/egui/android】在android中使用egui库
  • python-FILIP/字符串p形编码/数字三角形