为什么你的 C 语言程序总是崩?可能是动态内存没搞懂
malloc :malloc:void* malloc(size_t size);申请空间 -设置这片空间的开始周期size要申请多少字节size_t:无符号整数类型专门用来表示大小、长度、个数返回值 成功 → 返回内存首地址 失败 → 返回NUL举例int* p (int*)malloc(40);申请 40 字节堆内存用 int 指针 p 接收*3 条铁律malloc 申请的是堆内存必须判断是否 NULL必须手动 free否则内存泄漏calloc:callocvoid* calloc(size_t num, size_t sizenum元素个数size单个元素字节大小总字节数 \(num \times size\)从堆区申请内存自动把内存全部初始化为 0返回void*使用要强转类型举例int *p (int*)calloc(5, sizeof(int));申请5个int空间初始全0malloc与calloc:1.calloc功能和malloc一模一样:在堆区申请一片空间设置这个空间的出生周期2.区别一:malloc申请size个字节 calloc申请num*size个字节3.区别二:malloc对所有的字节按照cd进行填充 calloc对所有的字节按照00进行填充malloc与calloc申请空间判断是否合法#includestdio.h #includestdlib.h int main() { int* p (int*)malloc(40); if (pNULL) { printf(申请空间不足\n); return 0; } printf(扩容前:%p\n,p); int* q (int*)realloc(p, 80); if (q NULL) { printf(扩容空间不足\n); return 0; } printf(扩容后:%p\n, q); return 0; }realloc:realloc:void* realloc(void* ptr, size_t new_size);ptr原来 malloc / calloc / realloc 出来的指针size_t:无符号整数类型专门用来表示大小、长度、个数new_size新的总大小不是增加多少返回值新内存的地址三种工作情况原内存后方空闲空间充足原地扩容地址不变后方空间不足新开辟内存自动拷贝旧数据释放旧内存返回新地址扩容失败返回 NULL原内存保留不动freefree:void free(void* ptr);void* ptr接收任意类型的指针free:释放你用malloc / calloc / realloc申请的堆内存你可以把堆内存想象成你租的一间房子malloc 租房子realloc 换更大/更小的房子free 退房free(p);p NULL;free (p) 后不写 pNULL语法没错但非常危险free(p) 归还内存p 本身的值没变→ 变成野指针free 之后 p 变成野指针你再用*p或p[i]就是非法闯入别人的房子free的正确释放free只可释放堆区的第一个起始地址free : 释放空间,设置这片空间的结束周期.free 只是释放内存不是结束程序例题用realloc1~10扩容至1~20#includestdio.h int main() { // 堆区申请空间 40Byte1~10 int* p (int*)malloc(40); if (p NULL) { printf(申请空间太大 申请失败\n); return; } for (int i 0; i 10; i) p[i] i 1; printf(扩容前:); for (int i 0; i 10; i) printf(%d , p[i]); printf(\n); // 扩容 需要放1~10 11~20 int* q (int*)realloc(p, 80); if (q NULL) { printf(扩容空间太大 申请失败\n); return 0; } // 核心更新指针 p q;//将第一个地址都给p q NULL;//销毁q的地址 置空 for (int i 10; i 20; i) p[i] i 1; printf(扩容后:); for (int i 0; i 20; i) printf(%d , p[i]); printf(\n); if (p q) { printf(p之前40Byte后续还有连续空余的40Byte\n); } // 释放空间 free(p); // 将之前保存的地址彻底抹去避免发生非法访问 p NULL; }