【C语言】动态内存经典笔试题(下卷)

前言

如果说动态内存是C语言给我们的一个工具,那么只有掌握了工具的特点我们才能更好地使用。

紧随上卷,我们再来看看动态内存另外两道经典的笔试题。

(建议没看过上卷的朋友可以先看完上卷再回来:【C语言】动态内存经典笔试题(上卷)-CSDN博客

另外,如果光看想不出来的话,别忘了你还可以画图。

第三题

以下代码的运行结果是什么?为什么?

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

这个代码与"动态内存经典笔试题(上卷)"的第一题十分相似,但是这里确实传的是&str,接收用的是char**,好像没有什么问题了。

其实,这个hello确实能打印,但是这块空间是我们动态开辟来的,而这个代码中并没有对其释放,所以存在的问题是内存泄漏

改正:

那么这个改正只需要free和置空指针就行了:

#include<stdio.h>
#include<string.h>
#include<stdlib.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);
	free(str);//释放
	str = NULL;//置为空指针
}

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

第四题

以下代码的运行结果是什么?为什么?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void Test(void)
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	if (str != NULL)
	{
		strcpy(str, "word");
		printf(str);
	}
}

int main()
{
	Test();
	return 0;
}
分析:

我们首先申请了100字节的空间,将首地址交给str,然后free(str);就是将这块空间还给了操作系统,但是我们并没有将str置为空指针,所以str变为野指针,还是能找到这块空间,只是变成了非法访问,而且空间里的内容可能被修改了。

所以str!=NULL为真,会进入if语句,strcpy真的把"world"放进这块空间了(非法访问)。

改正:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void Test(void)
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	str = NULL;//改正
	if (str != NULL)
	{
		strcpy(str, "word");
		printf(str);
	}
}

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

这样就不会非法访问了。总结就是free完要置为空,避免成为野指针,造成非法访问。

到此,本文介绍,祝阅读愉快^_^

相关推荐
yyytucj12 分钟前
python--列表list切分(超详细)
linux·开发语言·python
byte轻骑兵30 分钟前
【0x0012】HCI_Delete_Stored_Link_Key命令详解
c语言·蓝牙·通信协议·hci
肖田变强不变秃41 分钟前
C++实现有限元计算 矩阵装配Assembly类
开发语言·c++·矩阵·有限元·ansys
王磊鑫1 小时前
Java入门笔记(1)
java·开发语言·笔记
喜欢猪猪1 小时前
分布式与微服务:构建现代应用的关键架构
开发语言·php
硬件人某某某1 小时前
Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)
java·开发语言·社区团购小程序·团购小程序·java社区团购小程序
kucupung1 小时前
【C++基础】多线程并发场景下的同步方法
开发语言·c++
Quantum&Coder2 小时前
Objective-C语言的计算机基础
开发语言·后端·golang
五味香2 小时前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
Joeysoda2 小时前
Java数据结构 (从0构建链表(LinkedList))
java·linux·开发语言·数据结构·windows·链表·1024程序员节