12-指针和动态内存-malloc calloc realloc free

一、视频笔记:

Malloc- void* malloc(size - size)

是一个通用的函数,库函数。所做的事情仅仅是,从 上找到空闲的内存。为你预留的空间然后通过指针返回给你。

Void *p = malloc(10 *sizeof(int))

总共需要的字节数是:单元数量*每个单元的字节数。

指针类型转换:写成int *p 而不是 void *p

Calloc - void *Calloc(size_t num ,size_t size)

也是返回一个void指针。接收两个参数,1:特定类型的元素的个数 2:类型的大小

Int *p = (int*)calloc(3 , sizeof(int)) 1:数量 2:类型的大小

Realloc - void* realloc(void* ptr , size_t size)

扩展。接收两个参数:1 :指向已分配内存的起始地址的指针 2 :新的内存块的大小

当我们想要的内存块可能比想要的要大,开新的,旧的有有剩余且有连续的内存,会拓展之前的块。拷贝释放。

**Free - free(A);**入参是内存的起始地址。

任何分配了的动态内存在程序结束之前会一直占据着内存,除非显示的释放它。

传入恰当的参数,realoc 可以作为free或malloc的替代品。

Malloc Calloc 两者区别:

Malloc:分配完内存后不会对其进行初始化,因此如果你没有得到值,你将会得到一些随机值(垃圾)。

Calloc:会对其初始化为0。

\[\]里面的值不能是一个变量,会大致编译错误。要先知道数组的大小:

Int *A =malloc(**(int*)**n*sizeof(int));

这里要有int类型的强制转换,否则会编译错误。

Int *B = (int*)realloc(A,0);相当于free(A)

二、代码示例:

我用vs运行有错误,下面写下就示例看下

复制代码
int main()
{
	int n;
	printf("Enter size of array\n");
	scanf_s("%d", &n);
	int* A = (int*)calloc(n, sizeof(int));
	for (int i = 0; i < n; i++)
	{
		A[i] = i + 1;
	}
    
	//free(A);
    //free空了之后还是可以修改A[2]地址的值。但是不是在所有机器上都行。
    //还是请确保只是用分配的内存,否则会像在黑暗中射击,不知道会发生什么
	//A[2] = 6;
	int* B = (int*)realloc(NULL, n * sizeof(int)); //可以用realloc代替free
	printf("Prev block address = %d, new address = %d\n", A, B);

    
	for (int i = 0; i < n; i++)
	{
		printf("%d ", A[i]);
	}
}
相关推荐
qq3621967058 分钟前
阿里裁员新消息(2026最新动态汇总)
java·开发语言·前端
.千余17 分钟前
【C++】模板进阶全解:非类型参数|全特化|偏特化|分离编译完全指南
开发语言·c++·笔记·学习·其他
代码改善世界24 分钟前
【C++进阶】C++11:列表初始化、右值引用与移动语义、完美转发全解析
java·开发语言·c++
scx_link35 分钟前
通过git bash在本地创建分支,并推送到远程仓库中
开发语言·git·bash
GZ同学43 分钟前
单双变量Ripley’s K函数 R 语言实现
开发语言·r语言
Channing Lewis44 分钟前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel
m0_547486661 小时前
《C#语言程序设计与实践》 全套PPT课件
c语言·c#·c语言程序设计
牛油果子哥q1 小时前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
小小龙学IT1 小时前
Apache Airflow 2.x 深度指南:用 Python 编排一切的现代化工作流引擎
开发语言·python·apache
少爷晚安。1 小时前
Java基础02_JDK&JRE下载安装及环境配置
java·开发语言