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

网站设计原则的历史新宾区网站建设

网站设计原则的历史,新宾区网站建设,南通做微网站,网站开发已有的知识储备#x1f984;个人主页:小米里的大麦-CSDN博客 #x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html #x1f381;代码托管:C语言: C语言方向#xff08;基础知识和应用#xff09; (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、… 个人主页:小米里的大麦-CSDN博客 所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 代码托管:C语言: C语言方向基础知识和应用 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、引言 二、malloc 1. 简介 2. 语法 3. 使用方法 4. 关于内存的使用重点 工作原理 示例一 malloc(sizeof(int)) 示例二 malloc(20) 重要点 5. 结论 三、free 1. 简介 2. 语法 3. 使用方法 4. 注意事项 1. 只释放一次 2. 检查指针是否为 NULL 3. 避免悬挂指针 4. 动态数组的处理 5. 释放结构体中的指针 四、calloc 1. 简介 2. 语法 3. 使用方法 4. 注意事项 五、realloc 1. 简介 2. 语法 3. 使用方法 4. 注意事项 5. 缩容的语法和基本用法 缩容注意事项 realloc缩容的工作原理 缩容的实际应用场景 总结 六、总结 共勉 一、引言 动态内存管理是C语言中一个重要的部分它允许程序在运行时动态地分配、使用和释放内存资源。这篇博客将详细讲解C语言中的四个核心函数malloc、free、calloc和realloc并讨论它们的使用方法和注意事项。 二、malloc 1. 简介 mallocmemory allocation用于动态分配指定大小的内存块。它从堆中分配内存并返回指向该内存块的指针。分配的内存内容未初始化。malloc - C Reference 2. 语法 #include stdlib.h//头文件 void* malloc(size_t size);//函数原型 size_t 是一个无符号整数类型用来表示对象的大小。size 参数指定要分配的内存字节数。如果成功分配内存则 malloc 返回指向这块内存的指针如果失败例如没有足够的可用内存则返回 NULL。 3. 使用方法 #include stdio.h #include stdlib.hint main() {int *p (int*)malloc(sizeof(int) * 10); // 分配能存储10个int类型元素的内存if (p NULL) {printf(内存分配失败\n);return 1;}// 使用分配的内存for (int i 0; i 10; i) {p[i] i;printf(%d , p[i]);}// 释放内存free(p);return 0; }分配内存 #include stdio.h #include stdlib.hint main() {int *p;p (int *)malloc(sizeof(int)); // 分配一个 int 类型大小的内存if (p NULL) {printf(内存分配失败\n);return 1;}*p 10; // 给分配的内存赋值printf(值: %d\n, *p); // 输出值free(p); // 释放内存return 0; } 分配多个元素 #include stdio.h #include stdlib.hint main() {int *p;size_t num_elements 5;p (int *)malloc(num_elements * sizeof(int));if (p NULL) {printf(内存分配失败\n);return 1;}for (int i 0; i num_elements; i) {p[i] i 1;}for (int i 0; i num_elements; i) {printf(%d , p[i]);}printf(\n);free(p);return 0; } #include stdio.h #include stdlib.hint main() {int *p (int*)malloc(sizeof(int)); // 分配4字节内存char *q (char*)malloc(20); // 分配20字节内存if (p NULL || q NULL) {printf(内存分配失败\n);return 1;}*p 100; // 存储一个int类型的值for (int i 0; i 20; i) {q[i] A; // 使用分配的20字节空间}// 当你尝试访问 q[20]第21字节时程序行为未定义可能会崩溃// q[20] B; // **不要这样做**因为它会导致未定义行为printf(p: %d\n, *p);printf(q: %.20s\n, q);free(p); // 释放分配的内存free(q);return 0; }4. 关于内存的使用重点 内存对齐: 实际上malloc 不仅分配请求的字节数还会考虑内存对齐的要求。这意味着它可能分配比你请求的更多的内存以便确保内存地址能够适当地对齐。例如如果系统要求int对齐到4字节边界那么malloc在分配内存时会确保返回的地址是4的倍数。如果当前的内存块不满足对齐要求malloc可能会跳过一些字节称为填充字节以找到一个符合对齐要求的位置。 内存碎片: 内存管理库会试图高效地管理内存避免碎片化。意味着它可能会保留一些额外的内存以备将来分配使用但这不是用户直接控制的。 工作原理 示例一 malloc(sizeof(int)) sizeof(int)通常为4这取决于具体的系统和编译器意味着malloc(sizeof(int))分配了4字节的内存。malloc(sizeof(int))的返回值是一个指向这4字节内存块的指针。程序可以通过这个指针来存储和访问一个int类型的变量。总结malloc(sizeof(int))一次性分配了4字节的内存供程序使用。 示例二 malloc(20) 当你调用malloc(20)时内存管理器通常由操作系统或运行时库管理会在堆中找到一块足够大的、至少有20字节的空闲内存块一次性分配给程序使用将其分配给你分配的20字节内存块起始地址由malloc返回返回的指针指向这段20字节的内存块你可以在这块内存上存储数据但只能使用这20字节的空间。一旦这块内存分配给你你就完全拥有了这20字节的空间程序可以自由地在这个范围内操作。内存管理如果你需要更多的空间你需要手动调用realloc来调整这块内存的大小或者分配一块新的、更大的内存块。 重要点 一次性分配malloc(20)是一次性从堆中分配20字节的内存。这20字节的内存是连续的并且可以立即使用。使用限制这20字节的内存并不会像“用一点给一点”那样逐渐分配而是一次性分配。如果在使用过程中超过了这20字节的边界例如试图访问第21字节则可能会引发未定义行为通常会导致程序崩溃或内存损坏。不会自动扩展malloc(20)分配的内存是固定的20字节。如果这20字节的空间用完了程序必须手动使用realloc来扩展内存块否则无法存储更多的数据。malloc本身不会自动再给20字节空间。 5. 结论 malloc是一次性分配不管你请求多少字节malloc都会一次性分配指定数量的内存给你供你自由使用。内存不会自动扩展一旦分配完内存除非你使用realloc否则内存块大小固定不会自动增长。边界检查在使用分配的内存时必须确保不超出已分配的范围否则会导致程序崩溃或数据损坏。 内存对齐malloc不仅分配你请求的内存量还会考虑对齐要求因此可能会分配比请求的更多的内存。其返回的内存地址会满足特定的对齐要求确保高效且安全的内存访问。尽管你可能请求了例如malloc(20)实际分配的内存可能会大于20字节以确保内存对齐但对你而言能安全使用的仍然是请求的20字节空间。 三、free 1. 简介 free用于释放由malloc、calloc或realloc分配的内存使这部分内存重新可用。手动释放内存free - C Reference 2. 语法 #include stdlib.h//头文件 void free(void *ptr);//函数原型 ptr: 是一个指向要释放的内存块的指针。如果 ptr 是 NULLfree 不做任何操作。 3. 使用方法 free的使用非常简单以下是一个例子 int *p (int*)malloc(sizeof(int) * 10); if (p ! NULL) {// 使用内存free(p); // 释放内存 }4. 注意事项 1. 只释放一次 不要对同一块内存多次调用 free。这会导致未定义行为比如程序崩溃。不要对未分配的内存调用 free。确保你只释放通过 malloc, calloc, 或 realloc 分配的内存。 2. 检查指针是否为 NULL 在调用 free 之前检查指针是否为 NULL if (p ! NULL) {free(p);p NULL; // 避免悬挂指针 } 3. 避免悬挂指针 当释放内存后通常将指针设置为 NULL 来避免悬挂指针问题。 这样可以防止意外地再次尝试释放相同的内存。 free(p); p NULL; 4. 动态数组的处理 如果使用 malloc 或 calloc 分配了数组释放内存时也需要正确处理 int *arr (int *)malloc(10 * sizeof(int)); ... free(arr); arr NULL; 5. 释放结构体中的指针 如果结构体中包含指向动态分配内存的指针在销毁结构体前需要释放这些内存 struct Node {int data;struct Node *next; };void freeNode(struct Node *node) {if (node ! NULL) {freeNode(node-next); // 递归释放链表中的每个节点free(node);} } 正确使用 free 函数是良好编程实践的一部分它可以避免内存泄漏并确保程序的稳定性和性能。 四、calloc 1. 简介 calloccontiguous allocation用于分配内存并初始化所有位为零。与malloc不同它接受两个参数分配的元素个数和每个元素的大小。calloc - C Reference 2. 语法 #include stdlib.h//头文件 void* calloc(size_t num, size_t size);//函数原型参数说明 num需要分配的元素数量。 size每个元素的大小以字节为单位。 返回值 如果内存分配成功则返回指向新分配内存的指针。如果内存分配失败则返回NULL。 3. 使用方法 calloc()函数为所请求的元素数量分配一个连续的内存块并且初始化所有元素为零值。意味着对于基本数据类型如int, float, 或者char等所有元素都会被设置为0。 #include stdio.h #include stdlib.hint main() {int *p (int*)calloc(10, sizeof(int)); // 分配能存储10个int类型元素的内存并初始化为0if (p NULL) {printf(内存分配失败\n);return 1;}// 使用分配的内存for (int i 0; i 10; i) {printf(%d , p[i]);}// 释放内存free(p);return 0; }4. 注意事项 与malloc相似calloc返回的指针也应检查是否为NULL。使用完动态分配的内存后必须调用free释放内存。 与 malloc 的区别 malloc()只分配内存但不初始化。calloc()不仅分配内存还会初始化所有元素为零值。calloc()接受两个参数元素个数和单个元素的大小而malloc()仅接受一个参数总大小。 如果你需要分配一段内存并且希望该内存被自动初始化为零那么calloc()是一个更好的选择。 如果你只需要分配内存而不关心初始化或者需要更灵活地控制内存大小那么malloc()可能更适合。这里有一个简单的例子来展示calloc()和malloc()的区别 #include stdio.h #include stdlib.h #include string.hint main() {int *array_calloc, *array_malloc;//array:数组int n 5;// 使用 callocarray_calloc (int *) calloc(n, sizeof(int));if (array_calloc NULL) {printf(calloc failed\n);return 1;}for (int i 0; i n; i) {printf(calloc[%d]: %d\n, i, array_calloc[i]);}free(array_calloc);// 使用 mallocarray_malloc (int *) malloc(n * sizeof(int));if (array_malloc NULL) {printf(malloc failed\n);return 1;}memset(array_malloc, 0, n * sizeof(int)); // 手动初始化为零for (int i 0; i n; i) {printf(malloc[%d]: %d\n, i, array_malloc[i]);}free(array_malloc);return 0; } 五、realloc 1. 简介 reallocreallocation在 C 语言中用于改变已分配内存块的大小。这个函数允许您动态地增加或减少内存空间的大小这对于需要根据运行时条件调整数据结构大小的应用程序非常有用。它可以扩展或缩小内存块如果新大小大于旧大小未初始化的新内存内容是不确定的。realloc - C Reference 2. 语法 #include stdlib.h//头文件 void* realloc(void *ptr, size_t size);//函数原型ptr: 指向要重新分配的内存块的指针先前通过malloc、calloc或realloc分配的内存块的指针。如果 ptr 是 NULL那么 realloc() 将执行与 malloc(size) 相同的操作。size: 新的内存大小以字节为单位。如果 size 为 0 并且 ptr 不是 NULL那么 realloc() 将释放 ptr 指向的内存块并返回一个 NULL 值。返回值realloc() 返回一个指向新内存块的指针。如果内存重新分配成功则返回的新指针可能与原来的指针不同。如果失败它将返回 NULL。如果size为0则相当于调用free(ptr)并返回NULL。 3. 使用方法 以下是一个简单的例子 #include stdio.h #include stdlib.hint main() {int *p (int*)malloc(sizeof(int) * 5); // 初始分配5个int类型元素的内存if (p NULL) {printf(内存分配失败\n);return 1;}// 扩展内存到10个int类型元素p (int*)realloc(p, sizeof(int) * 10);if (p NULL) {printf(内存重新分配失败\n);return 1;}// 使用扩展的内存for (int i 0; i 10; i) {p[i] i;printf(%d , p[i]);}// 释放内存free(p);return 0; }4. 注意事项 realloc的返回值应检查是否为NULL因为重新分配可能失败。如果realloc失败原来的内存块仍然有效应该避免内存泄漏。如果新大小为0realloc等同于调用free。 5. 缩容的语法和基本用法 语法不变同 realloc 的函数原型。 缩容注意事项 1. 数据保留: 如果新的大小大于或等于原始大小那么原始数据会被保留。如果新的大小小于原始大小那么原始数据中超出新大小范围的部分将被丢弃。因此在缩小内存之前最好先备份重要数据以防丢失。 2. 检查返回值: 总是要检查 realloc() 的返回值是否为 NULL这表示内存分配失败。如果返回值非 NULL则需要将指针更新为新的地址。 3. 类型转换: 类型转换通常需要应用到 realloc() 的返回值上以保持类型安全。 4. 性能考虑: 频繁缩容可能导致内存碎片化和性能降低。如果知道内存大小变化频繁考虑使用其他数据结构或者技术如自定义内存池。 以下是一个示例代码展示了如何使用 realloc() 缩小内存大小 #include stdio.h #include stdlib.hint main() {int *array;int n 10;int new_n;// 分配初始内存array (int *) malloc(n * sizeof(int));if (array NULL) {printf(Memory allocation failed!\n);return 1;}// 初始化数组for (int i 0; i n; i) {array[i] i 1;}// 打印初始数组printf(Initial array:\n);for (int i 0; i n; i) {printf(%d , array[i]);}printf(\n);// 缩小内存new_n 5;array (int *) realloc(array, new_n * sizeof(int));if (array NULL) {printf(Memory reallocation failed!\n);free(array);return 1;}// 打印缩容后的数组printf(Reduced array:\n);for (int i 0; i new_n; i) {printf(%d , array[i]);}printf(\n);// 释放内存free(array);return 0; } 在这个例子中原始数组大小为 10之后通过 realloc() 将其大小减小到了 5。 注意缩容后只打印了前五个元素这是因为原始数据中的后五个元素已经不再存在于新的内存块中。 #include stdio.h #include stdlib.h #include string.hint main() {char *p (char*)malloc(20 * sizeof(char)); // 分配20字节内存if (p NULL) {printf(内存分配失败\n);return 1;}strcpy(p, Hello, World!); // 向内存块中写入字符串// 缩小内存块到10字节p (char*)realloc(p, 10 * sizeof(char));if (p NULL) {printf(内存重新分配失败\n);return 1;}printf(缩容后的内容: %s\n, p); // 输出可能出现意外的内容free(p); // 释放内存return 0; } 代码解析初始时我们分配了20字节的内存并存储了字符串Hello, World!。 然后我们使用realloc将内存块缩小到10字节。此时只能保证前10字节的数据被保留。 由于字符串Hello, World!超过了10字节后面的部分可能被裁剪或者造成字符串结尾缺失。打印时由于没有足够的空间保存完整的字符串以及字符串的终止符\0因此可能会出现意外的输出未定义行为。realloc缩容的工作原理 当你使用realloc缩减内存块的大小时即size比原来分配的大小小其行为如下 数据保留realloc会保留内存块起始位置的一部分内容保留的部分大小为sizenew_size。换句话说缩容后的内存块中前size字节的数据会保留并保持不变。 释放多余内存对于超出size范围的多余内存realloc会将其释放。具体的释放方式取决于内存管理器的实现但对程序员来说这部分内存块将不再可用不能访问和使用。 指针返回如果缩容后的内存块可以在原始地址上处理那么realloc会直接返回原指针。如果内存管理器为了效率或其他原因在缩容过程中移动了内存块realloc将返回一个新的内存地址并且会将原来ptr指向的内容复制到新地址。 缩容的实际应用场景 缩容操作常用于以下场景 内存优化在动态数据结构如可变大小数组、缓冲区中随着数据量减少使用realloc来释放多余的内存空间。节省资源在程序运行中及时缩减不再需要的内存块大小可以节省系统资源特别是在嵌入式系统或内存受限的环境中。 总结 通过合理使用realloc缩容可以有效管理程序的内存资源确保程序在执行过程中占用最小的内存空间同时保持灵活性和高效性。 在缩小内存时一定要确保新大小能够容纳必要的数据。使用 realloc() 缩容时必须检查返回值是否为 NULL。对于经常需要改变大小的情况考虑使用更高效的数据结构或内存管理策略。 六、总结 动态内存管理是C语言编程中不可或缺的一部分正确使用malloc、free、calloc和realloc可以提高程序的灵活性和效率。以下是一些关键点 始终检查内存分配函数的返回值是否为NULL。使用完动态内存后一定要释放内存防止内存泄漏。对于复杂的数据结构确保正确释放所有分配的内存以避免内存泄漏和悬空指针。 掌握这些基本函数和相关注意事项可以帮助你编写出更健壮和高效的C程序。希望这篇博客能帮助你更好地理解和使用C语言中的动态内存管理 共勉
http://www.dnsts.com.cn/news/269307.html

相关文章:

  • 贵州省建设厅实名认证网站上海外贸仓库
  • 为您服务网站在百度搜不到网站
  • 编制综合网站平台的公司排名php 除了做网站
  • 静态网页制作实验报告林云seo博客
  • 免费建立国外网站福州网站制作有限公司
  • 河池网站制作应用市场app下载安装到手机
  • 做网站会什么制作哪个网站好
  • 湖北省建设网站首页网页版梦幻西游天象攻略
  • 满足seo需求的网站谁知道苏州溪城水处理网站谁做的
  • 随州建设网站网站架构包含哪几部分
  • 西安网站建设咪豆交互式网站开发
  • 陕西省建设信息网站怎么做记步数的程序到网站
  • 中国建设银行积分网站网站个人备案百度推官
  • 科技类网站简介怎么做做外贸如何浏览国外网站
  • 提供o2o网站建设四川建设网站官网
  • 营销网站类型深圳网站备案
  • 专业网站制作哪家强服装微商城网站建设
  • 钓鱼网站的主要危害免费建材网站模板
  • 手机企业网站制作网页设计师多少钱一个月
  • 留言网站建设的报告乐清网站的建设
  • 成都网站建设哪家好wordpress媒体库全选
  • 做软件的网站建设东风南方实业集团 深圳vi设计公司
  • 郑州网站关键陕西的网站建设公司排名
  • 怎样建设直播网站微信的微网站模板下载安装
  • 网站每年需要续费吗现在还用dw做网站设计么
  • 网络公司代做的网站注意事项山东济南建设网
  • 选择大连网站建设做网站 客户一直要求改
  • ps网站设计素材产品网络推广方案设计
  • 阿里云Windows网站建设国家企业信用信息公示系统官网湖北
  • 网站建设和网站推广可以同一家做吗普陀微信网站建设