目录动态内存规划动态内存函数的介绍总结动态内存规划 用C语言写程序时,因为语言的一些特性使用数组的时候只能用常量来申明数组,就导致数组的内存被卡得很死,不能根据我们的实际需求灵活的使
用C语言写程序时,因为语言的一些特性使用数组的时候只能用常量来申明数组,就导致数组的内存被卡得很死,不能根据我们的实际需求灵活的使用内存空间。有些空间的大小在程序运行时才能知道,那数组的编译时开辟空间的方式就不能满足了,这时候就只有动态开辟内存
malloc函数
void* malloc(size_t size);
这个函数的 作用是向内存申请一快连续可用的空间,并返回指向这块空间的指针。
free函数
当我们向内存空间申请的空间 使用完之后一定要用free()函数将申请的内存空间释放掉,否则可能会导致内存泄漏
void free(void* ptr)
// malloc函数 和 free函数的使用语法
#include<stdio.h>
#include<stdlib.h>
int main(){
int* arr = (int*)malloc(sizeof(int)*10); // 因为malloc函数的返回值是void*所以要进行强制类型转换
if(arr == NULL){ // 判断内存是否开辟成功
printf("内存开辟失败\n");
return;
}
int i = 0;
for(i = 0; i < 10; i++){ // 将数据放进我们开辟的空间中
arr[i] = i;
}
for(i = 0; i < 10; i++){
printf("%d",arr[i]); // 验证数据是否放进去了
}
free(arr);// 使用完空间后将它释放
arr = NULL;
return 0;
}
calloc函数
C语言还提供了一个函数叫做calloc,calloc函数也用来动态内存分配
void* calloc(size_t num, size_t size);
#include<stdio.h>
#include<stdlib.h>
int main(){
int* arr = (int*)calloc(10, sizeof(int));
if(NULL != arr){
int i = 0;
for(i = 0; i < sizeof(int)*10; i++){
printf("%d ",*((char*)arr+i));
}
}
free(arr);
arr = NULL;
return 0;
}
realloc函数
realloc函数的出现让动态内存管理更加灵活,有时我们会发现之前申请的空间太小了不够用,有时也会觉得申请的空间太大用不了那么多。为了能够更加灵活的管理内存我们可以使用realloc函数对开辟的内存空间进行调整
void* realloc(void* ptr, size_t size);
#include<stdio.h>
#include<stdlib.h>
int main(){
int* arr = (int*)malloc(sizeof(10));
if(NULL != arr){
// 业务处理
}
// 当开辟的空间用完时
int* tmp = (int*)realloc(arr, sizeof(int)*20);
if(NULL != tmp){
arr = tmp;
}
return 0;
}
柔性数组
typedef struct arr_type{
int i;
int a[]; // 柔性数组成员
}type_arr;
typedef struct arr{
int i;
int a[];
}arr;
printf("%d\n",sizeof(arr));// 输出的是4
柔性数组的使用
int main() {
struct rou_arr* ps = (struct rou_arr*)malloc(sizeof(int) + 10 * sizeof(int));
if (ps == NULL) {
printf("%s", strerror(errno));
}
ps->i = 10;
int i = 0;
for (i = 0; i < 10; i++) {
ps->arr[i] = i;
}
for (i = 0; i < 10; i++) {
printf("%d ", ps->arr[i]);
}
// 对柔性数组进行扩容
struct rou_arr* ptr = (struct rou_arr*)realloc(ps, sizeof(int) + sizeof(int) * 20);
if (ptr == NULL) {
printf("realloc is failure\n");
return -1;
}
ps = ptr;
for (i = 0; i < 20; i++) {
ps->arr[i] = i;
}
for (i = 0; i < 20; i++) {
printf("%d ", ps->arr[i]);
}
return 0;
}
柔性数组的好处有两个,一是方便内存释放,二是有利于访问速度
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!
--结束END--
本文标题: C语言动态内存规划详解
本文链接: https://www.lsjlt.com/news/137584.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0