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

跟内存有关的笔试题

文章目录

  • 一、题目1
  • 二、题目2
  • 三、题目3
  • 四、题目4
  • 五、题目5

一、题目1

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

代码存在的问题:
1、调用GetMemory函数的时候,str的传参为值传递,p是str的临时拷贝,所以在GetMemory函数内部动态开辟空间的地址存放在p中的时候,不会影响str的值。调用完GetMemory函数之后,str依然为NULL指针。这会使strcpy函数调用失败,原因是strcpy函数对NULL指针解引用。
2、GetMemory函数中malloc申请的空间没有释放,造成内存泄漏。
3、malloc的返回值最好判断一下,因为malloc有可能开辟内存空间失败返回空指针NULL(但在这个题里面这不是核心的缺陷)。
改法1:返回p的值(因为malloc在堆区申请的空间出了函数是不销毁的);释放内存,再将指针置空。

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

改法2:传址调用,在调用GetMemory函数时通过指针改变GetMemory函数外部的str的值;释放内存,再将指针置空。

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

二、题目2

char* GetMemory(void)
{
	char p[] = "hello world";
	return p;
}
void Test(void)
{
	char* str = NULL;
	str = GetMemory();
	printf(str);
}

代码存在的问题:返回栈空间地址问题,GetMemory函数内部创建的数组是临时的,虽然将数组的起始地址返回给了str,但是数组的内存出了GetMemory函数之后就被回收了,而str依然保存着数组的起始地址,这时如果printf使用了str,就会造成非法访问,因为str是野指针。
有返回栈空间地址问题的代码:

int* f1(void)
{
	int x = 10;
	return (&x);//括号不加也行
}

如果接受了这个函数返回的地址,就会造成野指针问题。

三、题目3

int* f2(void)
{
	int* ptr;
	*ptr = 10;
	return ptr;
}

代码存在的问题:没有对ptr进行初始化,ptr里的是随机值,是野指针,对ptr解引用,造成非法访问。

四、题目4

void GetMemory(char** p, int num)
{
	*p = (char*)malloc(num);
}
void Test(void)
{
	char* str = NULL;
	GetMemory(&str, 100);
	strcpy(str, "hello");
	printf(str);
}

代码存在的问题:
1、没有对申请的内存空间进行释放,要用free进行内存释放,然后将指针置空。
2、malloc的返回值最好判断一下,因为malloc有可能开辟内存空间失败返回空指针NULL(但在这个题里面这不是核心的缺陷)。
修改:用free将内存空间释放,然后将指针置空。

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;
}

五、题目5

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

代码存在的问题:
1、用free将内存空间释放之后,没有将指针置空。这时str为非空指针,进入if语句,由于str指向的内存空间已经还给操作系统,所以str成为野指针,这时在strcpy中使用str,造成非法访问。
2、malloc的返回值最好判断一下,因为malloc有可能开辟内存空间失败返回空指针NULL(但在这个题里面这不是核心的缺陷)。
修改:在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);
	}
}

http://www.kler.cn/a/3786.html

相关文章:

  • ElasticSearch DSL查询之高亮显示
  • 鸿蒙系统 将工程HarmonyOS变成OpenHarmony
  • MongoDB基本操作
  • Agent AI: 强化学习,模仿学习,大型语言模型和VLMs在智能体中的应用
  • [LeetCode] 哈希表 I — 242#有效的字母异位词 | 349#两个数组的交集 | 202#快乐数 | 1#两数之和
  • k8s集群安装
  • JavaScript中的for in和for of的区别(js的for循环)
  • Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能
  • Spring学习流程介绍
  • 跨境电商卖家工具——跨境卫士内容介绍
  • 华为OD机试用java实现 -【最多获得的短信条数】(2023-Q1 新题)
  • 【Linux】计算机网络1
  • 前端布局小案例,分享3个漂亮的卡片组件
  • 【多线程】CAS
  • 最小生成树kruskal-修建公路1
  • 过等保堡垒机选择云堡垒机可以吗?有推荐的吗?
  • linxu学习之进程
  • 第十四届蓝桥杯三月真题刷题训练——第 23 天
  • day1 计算机组成与结构考点汇总
  • 使用Docker 一键部署SpringBoot和SpringCloud项目
  • 软件测试面试题 —— 整理与解析(3)
  • Docker容器高级篇
  • Vue(3)-vue中的Ajax、Vuex、路由及UI组件库
  • 【Linux】[万字] Linux下的文件操作 及 Linux文件描述符fd 详解
  • 剑指offer-二维数组中的查找
  • 你了解Java应用开发中的注入攻击吗?