栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

动态内存1讲(案例——求素数)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态内存1讲(案例——求素数)

一、静态数组存在的问题:1.不能根据变量n动态申请内存 2.不能申请大块内存

int arr[10];//静态数组

动态内存可以很好地解决静态数组的问题。

二、动态内存概念(动态内存:在堆内申请,堆大小大于1.8G)

1、动态内存有什么用?

   1.1 可以根据变量n动态申请数组

2、怎么使用动态内存?

    2.1 malloc(90%)

       申请动态内存(从堆里),有可能失败,返回NULL(1.堆内空间不够 2.堆内空间足够,但连续空间不够)

#include //#include //头文件

	//动态内存申请10个整型空间;
	int* p = (int*)malloc(10 * sizeof(int));
	//动态内存申请20个字符空间;
	char* p2 = (char*)malloc(20 * sizeof(char));
	//动态内存申请100个double空间;
	double* p3 = (double*)malloc(100 * sizeof(double));

    2.2 calloc(1%)

int* p = (int*)calloc(10, sizeof(int));

   等价于

int* p = (int*)malloc(10 * sizeof(int));
for (int i=0; i<10; i++)
	{
		p[i] = 0;
	}

   2.3 realloc(9%)

 2.3.1申请重新分配有两种情况:

  •     申请成功: 

       1.原先内存后面如果有足够的空闲空间,则直接续给你;

       2.原先内存后面空闲空间不足,重新在堆内存中找足够大的连续的内存,分配给你(这时只需将前面的空间有效值拷贝过去,然后将前面空间释放)

  •     申请失败:堆内连续内存不够。
int n = 10;
	int* p = (int*)malloc(10 * sizeof(int));

	int* p = (int*)realloc(p, n * sizeof(int) * 2);

在上面2.1 malloc的例子上扩容2倍

//在这个基础上都扩容两倍
	//动态申请int空间10个
	int *p = (int*)malloc(10 * sizeof(int));
	p = (int*)realloc(p, 10*sizeof(int)*2);

	//动态申请字符空间20个
	char *p2 = (char*)malloc(20 * sizeof(char));
	p2 = (char*)realloc(p2, 20*sizeof(char)*2);

	//动态申请double空间100个
	double *p3 = (double*)malloc(100*sizeof(double));
	p3 = (double*)realloc(p3, 100*sizeof(double)*2);

2.3.2 常见的扩容倍数:1.5倍较好

3、怎么释放动态内存?(防止内存泄露)

4、注意事项:

      4.1 malloc的时候,前面的强转和后面的sizeof内的类型不一致,sizeof里面没有*号

      4.2 calloc中两个参数不要写反

      4.3 realloc:

            第一个参数需要填写的是原先内存的开头地址;

            第二个参数需要的是重新开辟的总字节数,不是在原先内存的基础上扩充的字节数

三、案例:求1~n内的素数

1、定义一个函数,思想如下图所示:

       从2开始(素数是大于1的自然数,直接将0和1排除,令p[0]=p[1]=0),判断3~9模2是否等于0,等于0,将其排除(算法中令p[j]=0);

       从3开始继续上述流程...

       重复上述步骤,直至找到1~n中所有素数;

#include //头文件
#include 


void Func(int n)
{
	int *p=(int*)malloc(n * sizeof(int)); 
	//int的大小(4)x*y   x:申请空间大小  y:申请空间单个大小,这里注意用int类型的指针接收,右边就强转int*(其他数据类型也一致);
	assert(p != NULL);
	//断言,判断是否申请成功;
	for (int i=0;i 

2、主函数:设n=100,求1~n中的素数

int main()
{
	Func(100);
	return 0;
}

结果如下:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510717.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号