1)malloc
C语言提供了?个动态内存开辟的函数:
void* malloc (size_t size);
这个函数向内存申请?块连续可用的空间,并返回指向这块空间的指针
1.如果开辟成功,则返回?个指向开辟好空间的指针。
2)free
C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:
void free (void* ptr);
注:malloc和free都声明在 stdlib.h 头文件中。
代码示例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 0;
scanf("%d", &num);
int arr[num] = { 0 };
int* ptr = NULL;
ptr = (int*)malloc(num * sizeof(int));
if (NULL != ptr)
{
int i = 0;
for (i = 0; i < num; i++)
{
*(ptr + i) = 0;
}
}
free(ptr);
ptr = NULL;
return 0;
}
这个代码简单就是开辟空间然后全部赋值为0,最后释放这个空间。
1)calloc
void* calloc (size_t num, size_t size);
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int*)calloc(10, sizeof(int));
if(NULL != p)
{
int i = 0;
for(i=0; i<10; i++)
{
printf("%d ", *(p+i));
}
}
free(p);
p = NULL;
return 0;
}
运行结果:
void* realloc (void* ptr, size_t size);
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* ptr = (int*)malloc(100);
if (ptr != NULL)
{
//业务处理
}
else
{
return 1;
}
//扩展容量
//代码1 - 直接将realloc的返回值放到ptr中
ptr = (int*)realloc(ptr, 1000);
//代码2 - 先将realloc函数的返回值放在p中,不为NULL,在放ptr中
int* p = NULL;
p = realloc(ptr, 1000);
if (p != NULL)
{
ptr = p;
}
//业务处理
free(ptr);
return 0;
}
根据选择题方法,我相信大家都会选代码2,为什么呢?它长啊!!!
其实代码2是对的,为什么呢?如果我们直接用代码1要是开辟失败了会怎么样?
相信大家知道为什么了吧?用代码2可以避免这种事情发生。
如果用代码1,那天真的出问题了你的ptr指针就变成了NULL,存储的数据也就都没了。
也许您没听说过它,但它确实是存在的。
typedef struct st_type
{
int i;
int a[0];//这个就是柔性数组成员
}type_a;
当然有的编译器可能会报错,可以改成这个
typedef struct st_type
{
int i;
int a[];//这个也是柔性数组成员
}type_a;
typedef struct st_type
{
int i;
int a[0];
}type_a;
int main()
{
printf("%d\n", sizeof(type_a));
return 0;
}
你猜猜运行结果是多少?
答案是:
再看一个示例:
我们在上面的基础上加上下面的代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
p->i = 100;
for(i=0; i<100; i++)
{
p->a[i] = i;
}
free(p);
return 0;
}
我们会发现代码正常运行,而此时这样柔性数组成员a,相当于获得了100个整型元素的连续空间。
柔性数组的优势:
1.方便内存释放
内存管理也讲完了
下面我们要讲文件处理,期待下一次相见。