c语言malloc和calloc使用心得

在c 中局部变量 静态变量 形参的内存是栈内存 是编译器分配的 而堆内存是用来存储结构 对象等信息

可以使用指针等操作 指针需要分配足够的内存 使用malloc calloc等方法

而且返回来的内存是个指针也就是个数组 使用指针 指针就会执行首地址

比如 c++中使用new 和delete来分配内存

char* c=new char[100];

delete c

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度

voidrealloc(void* ptr, unsigned newsize);*

malloc用于申请一段新的地址,参数size为需要内存空间的长度,如:

char p;

p=(char
)malloc(20);


void malloc(unsigned size);*

callocmalloc相似,参数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 上面的情景是一摸一样的
原文链接: https://www.cnblogs.com/liaomin416100569/archive/2011/02/16/9331522.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/21090

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午11:06
下一篇 2023年2月7日 下午11:06

相关推荐