动态内存分配

动态内存分配

头文件

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <windows.h>

malloc

int main() { //像内存申请10个整形的空间 int* p =(int*)malloc(10*sizeof(int));//malloc不初始化为零 if(p==NULL) { //打印错误的一个方式 printf("%s\n",strerror(errno)); } else { //正常使用空间 int i = 0; for(i=0;i<10;i++) { *(p+i)=i; } for(i=0;i<10;i++) { printf("%d ",*(p+i)); } } //当动态申请的空间不在用的时候,就应该还给操作系统 free(p); p = NULL; return 0; }

calloc

int main() { int* p=(int*)calloc(10,sizeof(int));//calloc初始化为零 if(p==NULL) { printf("%s\n",strerror(errno)); } else { int i = 0; for(i=0;i<10;i++) { printf("%d ",*(p+i)); } } free(p); p = NULL; return 0; }

realloc

int main() { int* p = (int*)malloc(20); if(p==NULL) { printf("%s\n",strerror(errno)); } else { int i = 0; for(i=0;i<5;i++) { *(p+i) = i; } } //就是在使用malloc开辟的20个字节空间 //假设这里,20个字节不能满足我们使用 //希望有40个字节的空间 //这里用realloc开辟 //realloc使用注意事项 //1.原有空间后有足够的空间,原空间数据不发生变化 //2.没有足够空间,在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新地址。 int* p2 = realloc(p,40); int i = 0; for(i=5;i<10;i++) { *(p+i) = i; } for(i=0;i<10;i++) { printf("%d ",*(p2+i)); } free(p); p = NULL; return 0; }

常见问题

int mian() { //1.对空指针进行解引用操作 int* p = (int*)malloc(40); //万一malloc失败了,p被赋值为NULL //*p = 0;//err int i = 0; for(i=0;i<10;i++) { *(p+i) = i;//err } free(p); p = NULL; //2.对动态开辟的内存的越界访问 int *p = (int*)malloc(5*sizeof(int)); if(p == NULL) { return 0; } else { int i = 0; for(i=0;i<10;i++) { *(p+i) = i; } } free(p); p = NULL; //3.对动态开辟内存的free int a = 10; int* p = &a; *p = 20; free(p); p = NULL; int *p = (int*)malloc(40); if(p == NULL) { return 0; } // //使用 int *p2 = realloc(p,80); if(p2 != NULL) { p = p2; } int *p = realloc(NULL,40);//malloc(40) //4.使用free释放动态开辟内存的一部分 int *p = (int*)malloc(40); if(p == NULL) { return 0; } int i = 0; for(i=0;i<10;i++) { *p++ = i; } //回收空间 free(p); p = NULL; //5.对同一块动态内存的多次释放 int *p = (int*)malloc(40); if(p == NULL) { return 0; } //使用 //释放 free(p); p = NULL;//避免二次free //... free(p); //6.动态开辟内存忘记释放(内存泄漏) while(1) { malloc(1); } return 0; }

__EOF__

本文作者bumper
本文链接https://www.cnblogs.com/bumper/p/17605579.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   bumper  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示