• C语言基础知识:内存分配


    目录

    内存分配原理

    内存分配方法

    静态内存分配

    动态内存分配

    MALLOC()

    CALLOC()

    内存释放

    注意事项


    在C语言中,内存分配是非常重要的一个概念,因为C语言中没有内置的垃圾回收机制,需要我们手动管理内存的分配和释放。下面我们来详细讲述C语言中的内存分配原理、方法和代码示例。

    内存分配原理

    在C语言中,内存分配是通过操作系统提供的动态内存分配函数来实现的。当我们定义一个变量或者数组时,操作系统会为其分配一块内存空间,这个过程称为静态内存分配。但有时候我们需要在程序运行中动态地分配内存,这个过程称为动态内存分配。

    内存分配方法

    C语言中常用的内存分配方法有两种:静态内存分配和动态内存分配。

    静态内存分配

    静态内存分配是指在编译期间就确定了内存的大小和位置,例如在函数体内声明的局部变量和全局变量都是静态内存分配。

    动态内存分配

    动态内存分配是指在程序运行中根据需要动态地分配内存。C语言中常用的动态内存分配函数有两个:malloc()和calloc()。

    MALLOC()

    malloc()函数用于动态分配内存,其原型为:

    void *malloc(size_t size);

    其中,size是需要分配的字节数。该函数返回一个指向分配内存的指针,如果分配失败,返回NULL。

    示例代码:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int main()
    4. {
    5. int *ptr;
    6. ptr = (int*) malloc(10 * sizeof(int)); //分配10个整型空间
    7. if(ptr == NULL) //判断是否分配成功
    8. {
    9. printf("内存分配失败\n");
    10. exit(1);
    11. }
    12. for(int i=0; i<10; i++)
    13. {
    14. *(ptr+i) = i; //赋值
    15. printf("%d ", *(ptr+i)); //输出
    16. }
    17. free(ptr); //释放内存
    18. return 0;
    19. }

    CALLOC()

    calloc()函数用于动态分配内存,并初始化为0,其原型为:

    void *calloc(size_t num, size_t size);

    其中,num是需要分配的元素个数,size是每个元素的大小。该函数返回一个指向分配内存的指针,如果分配失败,返回NULL。

    示例代码:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int main()
    4. {
    5. int *ptr;
    6. ptr = (int*) calloc(10, sizeof(int)); //分配10个整型空间,并初始化为0
    7. if(ptr == NULL) //判断是否分配成功
    8. {
    9. printf("内存分配失败\n");
    10. exit(1);
    11. }
    12. for(int i=0; i<10; i++)
    13. {
    14. printf("%d ", *(ptr+i)); //输出
    15. }
    16. free(ptr); //释放内存
    17. return 0;
    18. }

    内存释放

    在使用完动态分配的内存之后,需要手动将其释放,防止内存泄漏。C语言中使用free()函数来释放内存,其原型为:

    void free(void *ptr);

    其中,ptr是指向需要释放的内存空间的指针。

    示例代码:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int main()
    4. {
    5. int *ptr;
    6. ptr = (int*) malloc(10 * sizeof(int)); //分配10个整型空间
    7. if(ptr == NULL) //判断是否分配成功
    8. {
    9. printf("内存分配失败\n");
    10. exit(1);
    11. }
    12. for(int i=0; i<10; i++)
    13. {
    14. *(ptr+i) = i; //赋值
    15. printf("%d ", *(ptr+i)); //输出
    16. }
    17. free(ptr); //释放内存
    18. return 0;
    19. }

    注意事项

    在C语言中,内存分配是一个非常重要的话题。以下是一些注意事项:

    1. 内存泄漏:在堆内存分配后,需要手动释放内存。如果不释放内存,就会导致内存泄漏。内存泄漏会导致程序消耗大量的内存,最终导致程序崩溃。

    2. 指针越界:在使用指针时,要确保指针指向的内存地址是合法的。如果指针指向的地址越界,就会导致程序崩溃或产生未知的错误。

    3. 指针重复释放:当一个指针被释放后,不能再次释放它。如果再次释放指针,就会导致程序崩溃或产生未知的错误。

    4. 野指针:在使用指针时,必须确保指针指向的内存地址是合法的。如果指针指向的地址是无效的,就会导致程序崩溃或产生未知的错误。

    5. 栈溢出:在使用栈时,要确保不会出现栈溢出。如果栈溢出,就会导致程序崩溃或产生未知的错误。

    6. 内存对齐:在分配内存时,需要注意内存对齐的问题。内存对齐可以提高程序的效率。如果没有正确对齐内存,就会导致程序运行效率降低。

    7. 内存拷贝:在拷贝内存时,要确保源内存和目标内存的大小是相等的。如果源内存和目标内存的大小不相等,就会导致程序崩溃或产生未知的错误。

    总之,在C语言中,内存分配是一个非常重要的话题。程序员需要非常小心地使用内存,以确保程序的正确性和稳定性。

  • 相关阅读:
    在Qt creator中使用多光标
    IDEA远程断点调试jar包项目
    面向对象设计原则
    [WinError 193] %1 不是有效的 Win32 应用程序
    3.4 - 编译与解释 3.5 - 编译过程 3.8 - 文法
    监控脱岗离岗行为检测系统
    JQuery UI——滑动条组件
    1911 最大子序列交替和(状态机DP)(贪心)
    全球十大即时通信软件最新排名
    List集合之UML、特点、遍历方式、迭代器原理、泛型、装拆箱及ArrayList、LinkedList和Vector的区别
  • 原文地址:https://blog.csdn.net/qq_34274756/article/details/130860232