动态内存经典笔试题分析及柔性数组

9efbcbc3d25747719da38c01b3fa9b4f.gif

 c语言中的小小白-CSDN博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm=1001.2014.3001.5343

给大家分享一句我很喜欢我话:

知不足而奋进,望远山而前行!!!

铁铁们,成功的路上必然是孤独且艰难的,但是我们不可以放弃,远山就在前方,但我们能力仍然不足,所有我们更要奋进前行!!!

今天我们更新了动态内存的内容,

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

前言:

下面我们来看一下关于动态内存分配的经典试题,这些都是某些大厂曾经的面试题,希望大家可以好好看好好学,将这些东西通通搞懂它。

经典试题一:

void GetMemory(char* p)
{
	p = (char*)malloc(100);
//未进行内存释放free
}
void Test(void)
{
	char* str = NULL;
	GetMemory(str);
	strcpy(str, "hello world");
	printf(str);
}

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

我们一起来看一下这道题,乍一看这串代码没有任何问题,但是其实他会内存泄漏和程序崩溃问题

但是我们分析一下就会发现,当我们使用GetMemory进行动态内存分配时,错误就会显现出来了,因为当我们调用结束之后,这个分配到内存也会随之而销毁,所以这块内存就不在了,但是下面我们依然往这块内存里赋值

那我们该如何修改这串代码呢,下面我带大家修改一下。

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

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

将代码修改成这样,便可以成功进行编译了,既然传数不可以,我们就将地址传过去,这样就可以完美运行了。

经典试题二:

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函数返回之后,使用str指针去访问p数组,就是非法访问,因为p数组的内存已经还给了操作系统。

我们就举个例子吧,一个人叫作张三,然后开了一个宾馆,交了一晚上的钱,然后今天就有了使用权,然后第二天早上退房了,然后第二天下午张三又要去使用这个房间,此时就会被保安给赶出去,这里就相当于非法访问了。也就是返回栈空间地址的问题。

运行之后就会输出:

那么我们应该如何去改一下这串代码呢?

经典试题三:

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

接下来再看一下这串代码,这串代码哪里不正确呢,其实这个没有什么大的问题,即使我们运行一下也是没有问题的,唯一的瑕疵就在于没有用free进行内存释放,加上这一步就完美了!

经典试题四:

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

我们来分析一下这串代码,首先将hello赋给str之后,然后就用free进行空间释放了,所以后面的空间就还给操作系统了,虽然他还是存在的,但是我们无法使用了。然后str肯定不等于NIULL,然后将world赋给str,就会覆盖hello,因此会打印world

柔性数组:

下面我们再给大家将一下什么是柔性数组。

什么是柔性数组?

也许你从来没有听过什么是柔性数组这个概念,但是它的的确确是存在的。

在C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组的成员。

特点:

结构体中最后一个成员。

最后一个成员是数组,数组大小没有指定

struct S
{
	char c;
	int n;
	int arr[0]/arr[];//柔性数组。
};

柔性数组的特点:

1.结构体中的柔性数组成员前面必须至少又一个成员

2.sizeof返回的这种结构大小不包括柔性数组的内存

3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

柔性数组的使用:

struct S
{
	char c;
	int n;
	int arr[0];//柔性数组。
};

int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));

	return 0;
}

这就是一个柔性数组的例子,其实就是可以是数组的大小可以变大变小。

总结:

本篇博客我们讲了关于柔性数组与动态内存分配的一些例题,希望对大家有一定的帮助!

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1gi91bbmli47u

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链式二叉树

前言 本章将重点讲解链式二叉树的四种遍历方式。 一、链式二叉树 1、引入链式二叉树 我们知道完全二叉树可以使用堆存储,那非完全二叉树? 非完全二叉树不适合用堆来存储,因为浪费空间,所以非完全二叉树使用链式存储。 2、链式二…

做独立站烧不烧钱?真做起来的话要投入多少成本?

建立一个独立网站需要花钱吗? 实际做起来要花多少钱? 这是一种灵魂的拷问,也是大多数想进入这个行业或者刚刚起步的人都在思考或者思考的问题。 对于这样的问题,没有人能够给出确切的数字,甚至是确定的答案。 至于为什…

python基础——对序列的通用操作【+和*、in、切片操作、separator.join(iterable)】

📝前言: 我们已经学习了python数据容器中的列表,元组以及字符串。而他们都属于序列 (序列是指:内容连续,有序,可以用下标索引访问的数据容器) 在之前已经介绍了不少操作方法&#xf…

NVIDIA 推出地球-2云平台,使用AI超级计算机的模拟技术,预测整个地球的气候变化

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Sui技术帮助Studio Mirai成功实现创意愿景

Brian和Ben Li兄弟对艺术充满热情,通过共同创立的研发工作室Studio Mirai,他们正在探索Web3技术与创意产业的交集。 Studio Mirai的第一个头像类项目(profile picture,PFP)Tamashi存在于Nozomi World中,这…

教育内卷化:焦虑下的竞争与反思

教育内卷化:焦虑下的竞争与反思 一、教育内卷化的现象解读 教育内卷化,作为当前社会的热点话题,体现了教育资源竞争日趋激烈的现状。这一现象在中小学阶段尤为明显,家长们为了让孩子进入优质学校,不惜花费巨资购买学…

【SpringCloud】Consul中数据持久化配置并注册为Windows服务

Consul用起来两个比较麻烦的地方: 一是每次都需要执行打开命令行执行 consul agent -dev 命令来启动Consul服务,而且不能关掉命令行.另外一点就是在Consul中设置的数据,每次重启之后就没了. 就很烦.因此为大家带来解决上述问题的方法 首先要在官网下载Consul安装包的解压目录下…

ArcGIS添加天地图底图服务

目录 一、注册天地图官网、申请Key 二、ArcGis配置和使用 1、配置 2、使用 三、其他方法 一、注册天地图官网、申请Key 进入官网,并注册账号。 地址:国家地理信息公共服务平台 天地图 (tianditu.gov.cn) 点击地图API,申请Key。 注意&am…

使用有道bce-embedding-vase-v1模型构建知识向量库并进行相似度搜索

国产embedding 最开始使用LangChain结合通义千问API实现了基础的RAG(Retrieval-Augmented Generation)过程,当时认为embedding模型似乎是LangChain的一部分,然后又通过学习OpenAI的API发现,其实使用embedding模型不需要…

可视化日记——极坐标绘制雷达图

目录 一、创建极坐标 二、数据集准备 三、划分角度 四、指定半径 五、绘制 一、创建极坐标 Python中没有直接画雷达图的函数,若要绘制需要先创建画布和极坐标轴域,再设定角度与半径的参数(极坐标中角度与半径确定一个点的位置&#xff…

反射机制的知识

1.反射机制 静态语言:JAVA 和C 反射:可以借助于反射API可以获取任何类的内部信息,并可以直接操作任意对象的内部属性、方法、泛型等。 实现获得Class类的方法有哪些: 类名.classClass.forName("类的绝对路径")对象.ge…

Python爬虫基础教程:爬虫采集数据要注意什么?|电商数据商品详情页API接口

数字化时代,大数据信息的收集和应用逐步普及,离不开网络爬虫的广泛应用。由于数据和信息市场的不断扩大,需要大规模的网络爬虫来应对大规模的数据信息采集。在此过程中需要注意哪些问题? 1、先检查是否有API,API是网站…

Women of Polkadot:波卡生态的女性社群与创新力量

在 Web3 行业里,女性似乎总是被忽视的群体。线下峰会的合照一眼望去尽是西装革履的男性成员,项目和机构高管的名单里也似乎难以寻觅到女性领导者的身影。在这个强调技术、编程、极客精神的行业里,女性身份的缺席看起来如此天生自然。 根据 B…

人工智能基础部分25-一篇文章将透注意力机制(Attention)与自注意力机制(self-Attention),帮助大家加深印象

大家好,我是微学AI,今天给大介绍一下人工智能基础部分25-一篇文章将透注意力机制(Attention)与自注意力机制(self-Attention),帮助大家加深印象。注意力机制(Attention)与自注意力机制(self-Attention)都是在深度学习模型中用于提升模型性能的技术&#…

C 多维数组

C 语言支持多维数组。多维数组声明的一般形式如下: type name[size1][size2]...[sizeN];例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组: int threedim[5][10][4];二维数组 多维数组最简单的形式是二维数组。一个二维数组&#xff0c…

测试开发面试题总结(全)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 某基金管理公司线下测试开发面试题总结。 测开题目如下 可以尝试自己先写,写完之后…

【Linux】实现进度条小程序

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 回车和换行3. 缓冲区4. 进度条4.1 倒计时设置4.2 进度条4.2.1 实现简单进度条4.2.2 进度条完善 5. 附进度条代码5.1 Processbar.h5.2 Processbar.c5.3 Main.c5.4 Makefile 1. 前言 在之前已经了解了 【Lin…

GDK-你的跳广告神器(某足兆足兆替品)

GKD(又称搞快点)是一款免费开源简洁多规则的自动跳过广告的软件。简而言之,基于预设的定时更新订阅规则快照功能,实现识别并自动点击跳过任何开屏广告及点击关闭应用内部任何弹窗广告,如关闭某些APP开屏和内含推荐广告…

数据库关系代数运算:期末+复试

文章目录 一、知识概览二、并三、差四、交五、笛卡尔积六、投影七、选择八、连接九、除实战训练 一、知识概览 二、并 三、差 四、交 五、笛卡尔积 六、投影 投影是对列 七、选择 选择是对行 八、连接 自然连接是一种特殊的等值连接,他要求两个关系表中进行连…

自制颜色调试网站(渐变色调试,桌面选色)

一、页面展示 二、网站 缓若江海凝清光