找回密码
 立即注册
首页 业界区 安全 准备工作之动态内存分配[基于郝斌课程] ...

准备工作之动态内存分配[基于郝斌课程]

役魅肋 2025-9-23 18:21:04
定义一块内存可以用数组定义,也可以动态分配:
使用数组定义一块内存,则该块内存是静态的,也就是一旦定义之后,这块内存的大小就固定了,例如,数组元素个数是5,则定义后,这=这块内存大小就是5,不能再改变
但是用malloc动态分配的话,这块内存的大小就由我们自己来定义了,例如定义大小为5的内存块,使用完毕后,需要一个大小为3的内存块,就可以先使用malloc来定义一个大小为3的内存块,如何使用free来释放此块内存,之后再次使用malloc来定义大小为3的内存块,最后需要用free来释放该块内存
  1. /*
  2. @file      main.c
  3. @brief     数据结构预备知识之动态内存分配
  4. @author    EricsT (EricsT@163.com)
  5. @version   v1.0.0
  6. @date      2025-09-20
  7. @history   2025-09-20 EricsT - 新建文件
  8. */
  9. #include <stdio.h>
  10. #include <malloc.h>
  11. int main(void)
  12. {
  13.         int a[5] = { 4, 10, 2, 8, 6 };
  14.         int len;
  15.        
  16.         printf("请输入您需要分配的数组长度:len = ");
  17.         scanf("%d", &len);
  18.         //malloc函数只返回首字节地址
  19.         int* ptr = (int*)malloc(sizeof(int) * len);//分配内存
  20.         *ptr = 4;//类似于a[0] = 4
  21.         *(ptr + 1) = 10;//类似于a[1] = 10;
  22.         ptr[2] = 2;//类似于a[2] = 2;
  23.         printf("%d %d %d\n\n\n", ptr[0], ptr[1], ptr[2]);
  24.         for (int i = 0; i < len; ++i)
  25.                 scanf("%d", ptr + i);
  26.         for (int i = 0; i < len; ++i)
  27.                 printf("%d\n", ptr[i]);
  28.         free(ptr);//释放内存
  29.         return 0;
  30. }
复制代码
在以下程序中,调用了 f() 函数时, j 所占内存是存在的,当 f() 函数调用结束后, j 所占的内存就不合法了,因为 j 是一个局部变量
  1. /*
  2. @file      main.c
  3. @brief     数据结构预备知识之动态内存分配
  4. @author    EricsT (EricsT@163.com)
  5. @version   v1.0.0
  6. @date      2025-09-20
  7. @history   2025-09-20 EricsT - 新建文件
  8. */
  9. #include <stdio.h>
  10. int f();
  11. int main(void)
  12. {
  13.         int i = 10;
  14.         i = f();
  15.         printf("i = %d\n", i);
  16.         return 0;
  17. }
  18. int f()
  19. {
  20.         int j = 20;
  21.         return j;
  22. }
复制代码
在以下程序中,掉用函数结束后,ptr都可以指向合法的内存块
  1. /*
  2. @file      main.c
  3. @brief     数据结构预备知识之跨函数使用内存
  4. @author    EricsT (EricsT@163.com)
  5. @version   v1.0.0
  6. @date      2025-09-20
  7. @history   2025-09-20 EricsT - 新建文件
  8. */
  9. #include<stdio.h>
  10. #include <malloc.h>
  11. void fun(int** p);
  12. int main(void)
  13. {
  14.         int* p;
  15.         fun(&p);
  16.         //调用完之后,p就指向合法的内存块
  17.         return 0;
  18. }
  19. void fun(int** p)
  20. {
  21.         *p = (int*)malloc(4);//手动分配,不释放就会一直被占用
  22. }
复制代码
  1. /*
  2. @file      main.c
  3. @brief     数据结构预备知识之跨函数使用内存
  4. @author    EricsT (EricsT@163.com)
  5. @version   v1.0.0
  6. @date      2025-09-20
  7. @history   2025-09-20 EricsT - 新建文件
  8. */
  9. #include <stdio.h>
  10. #include <malloc.h>
  11. struct Student
  12. {
  13.         int sid;
  14.         int age;
  15. };
  16. Student* CreatStudent(void);
  17. void ShowStudent(Student* ptrStu);
  18. int main(void)
  19. {
  20.         Student* ptrStu;//占4个字节
  21.         //Student std;//占8个字节,所以采用指针操作
  22.         ptrStu = CreatStudent();
  23.         ptrStu->age = 10;
  24.         ptrStu->sid = 99;
  25.         ShowStudent(ptrStu);
  26.         return 0;
  27. }
  28. Student* CreatStudent(void)
  29. {
  30.         return (Student*)malloc(sizeof(Student));
  31. }
  32. void ShowStudent(Student* ptrStu)
  33. {
  34.         printf("%d %d\n", ptrStu->age, ptrStu->sid);
  35. }
复制代码
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册