• C语言动态内存分配


    C动态内存分配

    数组是固定数量的值的集合,在声明数组的大小之后,无法更改。有时,数组大小可能不够,就需要动态扩容。解决此问题,可以在运行时手动分配内存。这在C编程中称为动态内存分配

    动态分配存储器涉及到的库函数有

    • malloc()

    • calloc()

    • realloc()

    • free()

    这些函数在<stdlib.h>头文件中定义。


    1.malloc()

    名称“ malloc”代表内存分配,memory allocation。

    malloc()函数保留指定字节数的内存块。并且,它返回一个指针void可铸造成任何形式的指针。


    malloc()的语法

    ptr = (castType*) malloc(size);
    

    ptr = (int*) malloc(100 * sizeof(float));
    

    上面的语句分配了400个字节的内存。这是因为float的大小为4个字节。并且,指针ptr保存分配的存储器中的第一个字节的内存地址。

    如果无法分配内存,则表达式将产生一个NULL指针。


    2.calloc()

    名称“ calloc”代表连续分配,contiguous allocation。

    malloc()函数分配内存,但不初始化内存。而calloc() 函数分配内存并将所有位初始化为零。


    calloc()的语法

    ptr = (castType*)calloc(n, size);
    

    例:

    ptr = (float*) calloc(25, sizeof(float));
    

    上面的语句为float类型的25个元素在内存中分配了连续的空间。


    3.free()

    使用calloc()malloc()不单独释放创建的动态分配内存,必须明确使用free()释放空间。


    free()的语法

    free(ptr);
    

    该语句释放由指向的内存中分配的空间ptr


    示例1: malloc()和free()

    // Program to calculate the sum of n numbers entered by the user
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int n, i, *ptr, sum = 0;
        printf("Enter number of elements: ");
        scanf("%d", &n);
        ptr = (int*) malloc(n * sizeof(int));
     
        // if memory cannot be allocated
        if(ptr == NULL)                     
        {
            printf("Error! memory not allocated.");
            exit(0);
        }
        printf("Enter elements: ");
        for(i = 0; i < n; ++i)
        {
            scanf("%d", ptr + i);
            sum += *(ptr + i);
        }
        printf("Sum = %d", sum);
      
        // deallocating the memory
        free(ptr);
        return 0;
    }
    

    在这里,我们已为n个数字动态分配了内存


    示例2: calloc()和free()

    // Program to calculate the sum of n numbers entered by the user
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int n, i, *ptr, sum = 0;
        printf("Enter number of elements: ");
        scanf("%d", &n);
        ptr = (int*) calloc(n, sizeof(int));
        if(ptr == NULL)
        {
            printf("Error! memory not allocated.");
            exit(0);
        }
        printf("Enter elements: ");
        for(i = 0; i < n; ++i)
        {
            scanf("%d", ptr + i);
            sum += *(ptr + i);
        }
        printf("Sum = %d", sum);
        free(ptr);
        return 0;
    }
    

    4.realloc()

    如果动态分配的内存不足或超出要求,则可以使用该realloc()功能更改以前分配的内存的大小。


    realloc()的语法

    ptr = realloc(ptr, x);
    

    在这里,ptr以新的大小x重新分配。


    示例3: realloc()

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int *ptr, i , n1, n2;
        printf("Enter size: ");
        scanf("%d", &n1);
        ptr = (int*) malloc(n1 * sizeof(int));
        printf("Addresses of previously allocated memory: ");
        for(i = 0; i < n1; ++i)
             printf("%u
    ",ptr + i);
        printf("
    Enter the new size: ");
        scanf("%d", &n2);
        // rellocating the memory
        ptr = realloc(ptr, n2 * sizeof(int));
        printf("Addresses of newly allocated memory: ");
        for(i = 0; i < n2; ++i)
             printf("%u
    ", ptr + i);
      
        free(ptr);
        return 0;
    }
    

    运行该程序时,输出为:

    输入大小:2
    先前分配的内存的地址:26855472
    26855476
    
    输入新的尺寸:4
    新分配的内存地址:26855472
    26855476
    26855480
    26855484
    

    总结

    malloc动态分配内存,不初始化

    int n, *ptr = 0;
    printf("Enter number of elements: ");
    scanf("%d", &n);
    ptr = (int*) malloc(n * sizeof(int));
    
    

    如果无法分配内存,则返回NULL

    calloc动态分配内存,初始化所有bit为0

    int n, *ptr = 0;
    printf("Enter number of elements: ");
    scanf("%d", &n);
    ptr = (int*) calloc(n, sizeof(int));
    

    如果无法分配内存,则返回NULL

    free释放内存

    free(ptr);
    

    realloc重新分配内存

    ptr = realloc(ptr, n * sizeof(int));
    
  • 相关阅读:
    ORM
    数据库事务课上代码
    数据存储——SQLite数据库存储——API
    事务的ACID特性
    数据库练习3
    数据存储——SQLite数据库存储——SQL语句——DML数据操作语言、内置函数聚合函数
    数据库练习2
    数据存储——SQLite数据库存储——SQL语句——DQL数据查询语言
    数据库练习
    《那些事之Log4j》什么是log4j?【专题一】
  • 原文地址:https://www.cnblogs.com/ericling/p/11746972.html
Copyright © 2020-2023  润新知