当前位置: 首页 > news >正文

免费网站的资源可以发公众号吗在线装修设计师咨询

免费网站的资源可以发公众号吗,在线装修设计师咨询,建立网站怎么申请,网站做视频目录 1. 为什么要有动态内存分配2. malloc和freemallocfree 3. calloc和realloccallocrealloc 4. 常见的动态内存的错误对NULL直接的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存… 目录 1. 为什么要有动态内存分配2. malloc和freemallocfree 3. calloc和realloccallocrealloc 4. 常见的动态内存的错误对NULL直接的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放内存泄露 5. 动态内存经典笔试题分析题目1题目2题目3题目4 6. 柔性数组柔性数组的特点柔性数组的使用 7. 总结C/C中内存区域划分 1. 为什么要有动态内存分配 我们已经掌握的内存开辟方式有 int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的方式有两个特点 空间开辟大小是固定的数组在声明的时候必须指定数组的长度数组空间一旦确定了大小就不能调整 但是对于空间的需求不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道那数组的编译时开辟空间的方式就不能满足了 C语言引入了动态内存开辟让程序员自己可以申请和释放空间就比较灵活了 2. malloc和free malloc C语言提供了一个动态内存开辟的函数 void* malloc (size_t szie); 这个函数向内存申请一块连续可用的空间并返回指向这块空间的指针 如果开辟成功则返回一个指向开辟好空间的指针如果开辟失败则返回一个NULL指针因此malloc的返回值一定要做检查返回值的类型是void*,所以malloc函数并不知道开辟空间的类型具体在使用的时候使用者自己来决定如果参数size为0malloc的行为是标准是未定义的取决于编译器 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h #includestdlib.hint main() {int* p (int*)malloc(40);if (p NULL){perror(malloc);return 1;}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; }malloc只知道申请多大的空间但是不知道会放什么类型的数据所以malloc函数就只能返回void* free C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的函数原型如下 void free (void* ptr); free函数用来释放动态开辟的内存 如果参数ptr指向的空间不是动态开辟的那free函数的行为是未定义的如果参数ptr是NULL指针则函数什么事都不做 malloc和free都声明在stdlib.h头文件中 3. calloc和realloc calloc C语言还提供了一个函数叫calloc,calloc函数也用来动态内存分配。原型如下 void * calloc (size_t num , szie_t size); 函数的功能是为num个大小为size的元素开辟一块空间并且把空间的每个字节初始化为0.与函数malloc的区别只在于calloc会在返回地址之前把申请的空间的每个字节初始化全0 int main() {int* p (int*)calloc(10, sizeof(int));if (p NULL){perror(malloc);return 1;}int i 0;for (i 0; i 10; i){printf(%d , *(p i));}//释放空间free(p);p NULL;return 0; }所以如果我们对申请的内存空间的内容要求初始化那么可以很方便的使用calloc函数来完成任务 realloc realloc函数的出现让动态内存管理更加灵活时候回我们发现过去申请的空间太小了有时候我们又觉得申请的空间过大了那未来合理的时候的内存我们一定会对内存的大小做灵活的调整。那realloc函数就可以做到对动态内存大小的调整。 函数原型如下 void* realloc (void* ptr, size_t size); ptr是要调整的内存地址size调整之后新大小返回值为调整之后的内存起始位置这个函数调整原内存空间大小的基础上还会将原来内存中的数据移动到新的空间realloc在调整内存空间的是存在两种情况 情况1原有内存之后有足够大的空间 情况2原有空间之后没有足够大的空间 int main() {int* p (int*)calloc(10, sizeof(int));if (p NULL){perror(malloc);return 1;}int i 0;for (i 0; i 10; i){printf(%d , *(p i));}//空间不理想想要扩大空间20个整型int* ptr (int*)realloc(p, 20 * sizeof(int));if (ptr ! NULL){p ptr;}else {perror(realloc);return 1;}//释放空间free(p);p NULL;return 0; }realloc 1.realloc调整空间失败会返回NULL 2.调整成功有两种情况 情况1 在已经开辟好的空间后面没有足够的空间直接进行空间的扩大在这种情况下realloc函数会在内存的堆区重新找一个空间满足新的空间的大小需求的同时会把旧的数据拷贝到新空间然后释放空间同时返回新的空间的起始地址 情况2 在已经开辟好的空间后边有足够的空间直接进行扩大扩大空间后直接返回旧的空间的起始地址 realloc该函数除了能够调整空间之外他还能实现和malloc一样的功能 int main() {int* p (int*)realloc(NULL, 40);//等价于macllocif (p NULL){perror(malloc);return 1;}4. 常见的动态内存的错误 对NULL直接的解引用操作 int main() {int* p (int*)malloc(100);*p 20;//p有可能是NULL指针的return 0; }正确写法 int main() {int* p (int*)malloc(100);if (p NULL){//报错信息perror(malloc);return 1;}*p 20;//释放free(p);p NULL;return 0; }对动态开辟空间的越界访问 int main() {int* p (int*)malloc(40);if (p NULL){return 1;}int i 0;for (i 0; i 10; i){*(p i) i;//当循环到第11次时就越界访问了}free(p);p NULL;return 0; }对非动态开辟内存使用free释放 nt main() {int a 10;int* p (int*)malloc(40);if (p NULL){return 1;}//使用//...p a;//p指向的空间就不再是堆上的空间free(p);//程序崩溃p NULL;return 0; }malloc/calloc/realloc 申请的空间如果不主动释放出了作用域是不会被销毁的 释放的方式 1.free主动释放 2.直到程序结束才由操作符回收 使用free释放一块动态开辟内存的一部分 int main() {int a 10;int* p (int*)malloc(40);if (p NULL){return 1;}p;//p不再指向动态内存的起始位置了free(p);//程序崩溃p NULL; }对同一块动态内存多次释放 int main() {int a 10;int* p (int*)malloc(40);if (p NULL){return 1;}free(p);free(p);//重复释放程序崩溃p NULL;return 0; }动态开辟内存忘记释放内存泄露 void test() {int* p (int*)malloc(100);if (p ! NULL){*p 20;} }int main() {test();while (1); }忘记释放不再使用的动态开辟的空间会造成内存泄露 切记动态开辟的空间一定要释放并且正确释放 5. 动态内存经典笔试题分析 题目1 void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, hello world);printf(str); }int main() {Test();return 0; }解析 GetMemory函数采用值传递的方式无法将malloc开辟空间的地址放回str中调用结束后str依然是NULL指针strcpy中使用了str,就是对NULL指针解引用操作程序崩溃内存泄露 正确代码 void GetMemory(char** p) {*p (char*)malloc(100);return p; } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, hello world);printf(str);free(str);str NULL; }int main() {Test();return 0; }题目2 char* GetMemory(void)//局部变量 {char p[] hello world;return p;//返回的是p首元素的地址 } void Test(void) {char* str NULL;str GetMemory();printf(str);//野指针 }int main() {Test();return 0; }题目3 void GetMemory(char** p, int num) {*p (char*)malloc(num); } void Test(void) {char* str NULL;GetMemory(str, 100);strcpy(str, hello);printf(str); }int main() {Test();return 0; }题目4 void Test(void) {char* str (char*)malloc(100);strcpy(str, hello);free(str);//释放了空间但是里面还存放着地址str也就变成了野指针if (str ! NULL){strcpy(str, world);//非法访问printf(str);} }int main() {Test();return 0; }6. 柔性数组 也许 你从未听说过柔性数组这个概念但是它确实是存在的。C99中结构中的最后一个元素允许是未知大小的数组这就叫做柔性数组成员 在结构体中最后一个成员未知大小的数组 这个数组就是柔性数组 例如 struct st_type {int i;int a[];//柔性数组成员 };柔性数组的特点 结构体中的柔性数组成员前面必须至少一个其他成员sizeof返回的这种结构体大小不包含柔性数组的内存包含柔性数组成员的结构用malloc()函数进行内存的动态分配并且分配的内存应该大于结构的大小以适应柔性数组的预期大小 例如 struct s {int n;int arr[]; };int main() {printf(%d\n, sizeof(struct s));//4个字节return 0; }柔性数组的使用 struct s {char c;int n;int arr[]; };int main() {//printf(%d\n, sizeof(struct s));//4个字节struct s*ps(struct s*)malloc(sizeof(struct s) 10 * sizeof(int));if (ps NULL){perror(malloc);return 1;}ps-c w;ps-n 100;int i 0;for (i 0; i 10; i){ps-arr[i] i;}//假设空间不足struct s* ptrrealloc(ps, sizeof(struct s) 15 * sizeof(int));if (ptr ! NULL){ps ptr;}else {perror(realloc);}//继续使用//释放free(ps);ps NULL;return 0; } 7. 总结C/C中内存区域划分 C/C程序内存分配的几个区域 栈区在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等堆区一般由程序员分配释放若程序员不释放程序结束时可能由OS回收。分配方式类似于链表数据段静态区存放全局变量、静态数据。程序结束后由系统释放代码段存放函数体类成员函数和全局函数的二进制代码
http://www.laogonggong.com/news/113497.html

相关文章:

  • 网站建设招标流程图大网站是用什么做html5的
  • 网站验证码系统商城分销系统
  • html5响应式网站源码中企动力销售怎么样
  • 大型搬家门户网站源码深圳专业高端网站建设费用
  • 网站怎么开发设计国外的app设计网站
  • win8网站源码泰州营销型网站
  • 网页布局的方式有哪些网站如何做seo优化教程
  • 网站建设001智能科普网站平台建设方案
  • 徐汇郑州阳网站建设手机网站页面尺寸
  • 汶上做网站网页制作流程
  • 2019做网站网页设计与制作软件有哪些
  • 网站建设公司成都网站默认主页设置
  • 利用php做网站教程建站导航
  • 58同城做网站找谁缪斯设计官网
  • 后台管理网站模板网页设计基础教程第二版课后答案
  • 石河子建设网站如何开网店具体步骤
  • 定制开发网站微信网站开发是什么
  • 潍坊网站建设服务商软件开发工程师面试
  • 做网站用什么域名比较好建筑设计官网
  • title 镇江网站建设wap网站建设费用
  • 网站应用水印图片网站建设项目管理论文
  • 爱站工具下载宁波seo外包快速推广
  • 国际网站建设公司查询网站后台地址
  • 网页设计与网站建设ppt移动端响应式网站怎么做
  • 自己做手机版网站制作台中网站建设
  • 福州住房建设厅网站平面设计类网站什么颜色好
  • 中国旅游网站的建设界面网站的风格
  • 网站虚拟视频主持人装修网站设计平台
  • 服务器建立网站建设银行信用卡网站下载
  • 汕头市网站建设分站服务机构提卡的网站怎么做