网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 其他技术区 > 算法与数据结构 >

准备工作之动态内存分配[基于郝斌课程]

时间:2025-09-21 11:22

人气:

作者:admin

标签:

导读:定义一块内存可以用数组定义,也可以动态分配: 使用数组定义一块内存,则该块内存是静态的,也就是一旦定义之后,这块内存的大小就固定了,例如,数组元素个数是5,则定义后,...

定义一块内存可以用数组定义,也可以动态分配:

使用数组定义一块内存,则该块内存是静态的,也就是一旦定义之后,这块内存的大小就固定了,例如,数组元素个数是5,则定义后,这=这块内存大小就是5,不能再改变

但是用malloc动态分配的话,这块内存的大小就由我们自己来定义了,例如定义大小为5的内存块,使用完毕后,需要一个大小为3的内存块,就可以先使用malloc来定义一个大小为3的内存块,如何使用free来释放此块内存,之后再次使用malloc来定义大小为3的内存块,最后需要用free来释放该块内存


/*
@file      main.c
@brief     数据结构预备知识之动态内存分配
@author    EricsT (EricsT@163.com)
@version   v1.0.0
@date      2025-09-20
@history   2025-09-20 EricsT - 新建文件
*/


#include <stdio.h>
#include <malloc.h>


int main(void)
{
	int a[5] = { 4, 10, 2, 8, 6 };

	int len;
	
	printf("请输入您需要分配的数组长度:len = ");
	scanf("%d", &len);

	//malloc函数只返回首字节地址
	int* ptr = (int*)malloc(sizeof(int) * len);//分配内存

	*ptr = 4;//类似于a[0] = 4
	*(ptr + 1) = 10;//类似于a[1] = 10;
	ptr[2] = 2;//类似于a[2] = 2;

	printf("%d %d %d\n\n\n", ptr[0], ptr[1], ptr[2]);

	for (int i = 0; i < len; ++i)
		scanf("%d", ptr + i);

	for (int i = 0; i < len; ++i)
		printf("%d\n", ptr[i]);

	free(ptr);//释放内存

	return 0;
}

在以下程序中,调用了 f() 函数时, j 所占内存是存在的,当 f() 函数调用结束后, j 所占的内存就不合法了,因为 j 是一个局部变量


/*
@file      main.c
@brief     数据结构预备知识之动态内存分配
@author    EricsT (EricsT@163.com)
@version   v1.0.0
@date      2025-09-20
@history   2025-09-20 EricsT - 新建文件
*/

#include <stdio.h>

int f();

int main(void)
{
	int i = 10;

	i = f();
	printf("i = %d\n", i);

	return 0;
}

int f()
{
	int j = 20;
	return j;
}

在以下程序中,掉用函数结束后,ptr都可以指向合法的内存块


/*
@file      main.c
@brief     数据结构预备知识之跨函数使用内存
@author    EricsT (EricsT@163.com)
@version   v1.0.0
@date      2025-09-20
@history   2025-09-20 EricsT - 新建文件
*/

#include<stdio.h>
#include <malloc.h>

void fun(int** p);

int main(void)
{
	int* p;
	fun(&p);
	//调用完之后,p就指向合法的内存块
	return 0;
}
void fun(int** p)
{
	*p = (int*)malloc(4);//手动分配,不释放就会一直被占用
}

/*
@file      main.c
@brief     数据结构预备知识之跨函数使用内存
@author    EricsT (EricsT@163.com)
@version   v1.0.0
@date      2025-09-20
@history   2025-09-20 EricsT - 新建文件
*/

#include <stdio.h>
#include <malloc.h>

struct Student
{
	int sid;
	int age;
};

Student* CreatStudent(void);
void ShowStudent(Student* ptrStu);

int main(void)
{
	Student* ptrStu;//占4个字节
	//Student std;//占8个字节,所以采用指针操作

	ptrStu = CreatStudent();
	ptrStu->age = 10;
	ptrStu->sid = 99;
	ShowStudent(ptrStu);
	return 0;
}

Student* CreatStudent(void)
{
	return (Student*)malloc(sizeof(Student));
}

void ShowStudent(Student* ptrStu)
{
	printf("%d %d\n", ptrStu->age, ptrStu->sid);
}

 

本文来自博客园,作者:EricsT,转载请注明原文链接:https://www.cnblogs.com/EricsT/p/19103325

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信