c语言malloc和calloc使用心得
来源:互联网 发布:ios知乎日报 api 编辑:程序博客网 时间:2024/04/30 02:37
在c 中局部变量 静态变量 形参的内存是栈内存 是编译器分配的 而堆内存是用来存储结构 对象等信息
可以使用指针等操作 指针需要分配足够的内存 使用malloc calloc等方法
而且返回来的内存是个指针也就是个数组 使用指针 指针就会执行首地址
比如 c++中使用new 和delete来分配内存
char* c=new char[100];
delete c
realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度
void* realloc(void* ptr, unsigned newsize);
malloc用于申请一段新的地址,参数size为需要内存空间的长度,如:
char* p;
p=(char*)malloc(20);
void* malloc(unsigned size);
calloc与malloc相似,参数elsize 为申请地址的单位元素长度,nelem为元素个数,如:
char* p;
p=(char*)calloc(20, sizeof(char));
这个例子与上一个效果相同
void* calloc(size_t nelem, size_t elsize);
都在stdlib.h函数库内
情景1:
char *str="";
//到这一句就报错了 因为堆内存不够
strcpy(str, "Hellooooo");
printf("String is %s/n", str);
free(str);
情景2:
char *str="";
if ((str = (char*)malloc(1)) == NULL)
{
printf("Not enough memory to allocate buffer/n");
}
strcpy(str, "Hellooooo");
printf("String is %s/n", str);
//在这里报错 因为空间只有1 Hellooooo占用的空间明显大于1 所以肯定是编译器开启的新空间 所以不是malloc的空间
//free只能释放malloc 或者calloc创建的空间
//所以报错
free(str);
情景3:
char *str="";
if ((str = (char*)malloc(10)) == NULL)
{
printf("Not enough memory to allocate buffer/n");
}
str="Hello";
printf("String is %s/n", str);
//在这里报错 因为=是指向的意思 str 重新指向了一段新的内存 不是malloc出来的
//free只能释放malloc 或者calloc创建的空间
//所以报错
free(str);
正确的写法
char *str="";
if ((str = (char*)malloc(10)) == NULL)
{
printf("Not enough memory to allocate buffer/n");
}
//大小为10的内存 不能放10个字符只能放9个 因为c还有个/0 表示结尾
strcpy(str, "Hellooooo");
printf("String is %s/n", str);
free(str);
当然
delete 也只能删除new 关键字创建的内存 和malloc 上面的情景是一摸一样的
- c语言malloc和calloc使用心得
- C语言:使用malloc()和calloc()动态分配内存
- C语言malloc和calloc的区别
- c语言中malloc和calloc比较
- malloc和calloc使用
- C语言 malloc realloc calloc
- C语言中动态内存分配 malloc realloc calloc 的使用和比较
- C语言内存分配函数malloc、calloc和realloc
- C语言内存分配:malloc、calloc、realloc
- C语言之 malloc,realloc, calloc区别
- C语言realloc,malloc,calloc的区别
- C语言的malloc、calloc、realloc
- C语言:malloc 与 calloc的区别
- C语言 malloc calloc realloc 区别
- C语言内存分配--malloc、calloc、realloc
- C语言中realloc,malloc,calloc区别
- C语言:动态内存malloc,calloc,realloc
- malloc和calloc区别(c)
- luaopen_io 失败解决方法
- libtool使用方法
- 计算机机房搬迁计划
- 读“一直在山寨,很少有创新的中国”有感
- 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 '' 中的标识列插入显式值。
- c语言malloc和calloc使用心得
- 认识大家
- cisco交换机配置
- tomcat6+spring2.5+xfire1.2开发webservice报错原因
- 类的继承引起的一个错误:error C2259 cannot instantiate abstract class due to following members
- 大白菜 U盘系统指南
- CSS 基本选择器
- WinCE开始菜单定制(二)
- 从“土豆”看软件**