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

相关推荐
FAFU_kyp13 分钟前
Rust 模式匹配:match 与 if let 详解
开发语言·后端·rust
明洞日记16 分钟前
【CUDA手册004】一个典型算子的 CUDA 化完整流程
c++·图像处理·算法·ai·图形渲染·gpu·cuda
燃犀知不可乎骤得27 分钟前
MFC学习记录
c++·学习·mfc
星火开发设计40 分钟前
C++ 运算符全解析:算术、关系、逻辑与位运算
java·开发语言·c++·学习·位运算·知识·操作符
AI_567843 分钟前
Postman接口测试极速入门指南
开发语言·人工智能·学习·测试工具·lua
Emilin Amy1 小时前
【C++】【STL算法】那些STL算法替代的循环
开发语言·c++·算法·ros1/2
遇印记1 小时前
蓝桥java求最大公约数
java·开发语言
ONExiaobaijs1 小时前
【无标题】
java·开发语言·spring·maven·程序员创富
IMPYLH1 小时前
Lua 的 String(字符串) 模块
开发语言·笔记·单元测试·lua
qeen871 小时前
【数据结构】顺序表的详细解析及其简单通讯录实现
c语言·数据结构·学习