目录
一.malloc()和free()(原型都在stdlib.h头文件)
1.malloc()
2.free()函数
3.案例演示
二.calloc()
三.realloc()
在在C语言的内存当中,针对不同的数据我们所存放的位置都是不一样的。内存栈区和静态区系统会自动创建和销毁,内存堆区由自己创建,释放。
区域 | 作用 |
内存栈区 | 存放局部变量名 |
内存堆区 | 动态分配的变量 |
静态区 | 用于存放全局变量或者静态变量,字符串常量 |
而如何实现对象的自动创建和释放,在这章当中我们将学习到。
一.malloc()和free()(原型都在stdlib.h头文件)
1.malloc()
malloc()参数,该函数接受一个参数(所需的内存字节数)。Malloc()函数会找到合适的空闲内存块,这样的内存是匿名的。所以,malloc()分配内存,但是不会为其赋名。它返回动态分配内存块的首字节地址。
因此,可以把该地址赋给一个指针变量,并使用指针访问这块内存。如果malloc()分配内存失败,则放回空指针。
malloc()返回一个void指针。该类型相当于“通用指针”。所以这种情况下直接就行
double * ptd = malloc(30 * sizeof(double)); |
但一般情况下我们都会将返回类型进行类型进行强制转换,这样主要是为了提高代码的可读性。
double * ptd; ptd = (double *) malloc(30 * sizeof(double)); 分配30个double类型的空间,(double * )将类型强制转换为 double * |
然后让ptd指向这个块的首元素,便可像使用数组名一样使用它
2.free()函数
free()函数的参数是之前malloc返回的地址(参数是一个指针),该函数释放之前malloc()分配的内存。
因此,动态分配内存的存储器从调用malloc()分配内存到调用free()释放内存为止
double * ptd; ptd = (double *) malloc(30 * sizeof(double)); 分配30个double类型的空间,(double * )将类型强制转换为 double * free(ptd) |
3.案例演示
演示代码
#include <stdio.h>
#include <stdlib.h>
int main(){
double * ptd;
int max;
int number;
int i = 0;
puts("what is the maximum number of type double entries?");
if(scanf("%d",&max) != 1){ //输入max错误
puts("Number not correctly entered -- bye.");
exit(EXIT_FAILURE); //退出程序代码
}
ptd = (double *) malloc(max * sizeof(double)); //为ptd分配内存
if(ptd == NULL){ //ptd动态分配空间错误
puts("Memory allocation failed.Goodbye.");
exit(EXIT_FAILURE);
}
puts("Enter the values (q to quit):");
while(i < max && scanf("%lf",&ptd[i]) == 1) ++i; //给ptd的每个元素赋值
printf("Here are your %d entries:\n",number = i);
for(i = 0; i < number ;i++){
printf("%7.2f",ptd[i]); //打印各元素
if(i % 7 == 6) putchar('\n'); //每7个元素打印一行
}
if(i % 7 != 0) putchar('\n'); //最后一行继续打印\n,除非上一个循环中打印过
puts("Done.");
free(ptd); //释放动态内存
return 0;
}
这个程序,让用户输入要存储的数字个数,然后通过用户输入的数,程序通过malloc来创建合适的存储大小。这样做可以很好节省程序的消耗开支
二.calloc()
分配内存还可以使用calloc(),和malloc()类似。Calloc()函数接受两个无符号整数作为参数,第一个参数是所需的存储单元数量,第二个参数是存储单元的大小(以字节为单位)
double * ptd;
ptd = (double *) calloc(30 , sizeof(double)); //和ptd = (double *) malloc(30 * sizeof(double));类似
注意calloc()分配的内存空间在使用完以后也必须使用free()释放空间
这里要说下,程序把静态对象,自动对象和动态分配的对象存储在不同的区域
calloc和malloc的区别在于,calloc会把初始化的内存的所有位设置为0
三.realloc()
这个函数用于修改一个原先已经分配的内存块的大小。可缩小(内存块尾部的部分内存位置被拿掉),也可扩张
格式
realloc(指针,新的大小)
在这个例子中,我们将ch指针原本指定的地址大小从3个字节变为了4个字节。可以发现可以正常使用
好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈