(五)学习笔记 c语言基础 动态内存分配

1.使用标准库函数在C程序中动态分配内存:malloc(),calloc(),free()和realloc()

数组是单个类型的固定数量值的集合。在使用之前,需要先声明数组的大小。然而有时声明的数组大小可能不足,要解决此问题,可以在运行时手动分配内存(即动态内存分配)。
在<stdlib.h>库下,有四个函数:malloc(),calloc(),realloc()和free()

1) malloc()代表内存分配

该malloc()函数保留指定字符数的内存块。并且返回一个类型的指针void,可以将其转换为任何形式的指针。
语法:
int *ptr = (cast-type *) malloc(byte-size);
例子:
int *ptr = (int *) malloc(100 * sizeof(int));
int大小为4个字节,此语句分配400个字节的内存。并且,指针ptr保存分配的存储器中的第一个字节的地址。如果空间不足,分配将失败并返回NULL指针。

2)calloc()代表连续分配

malloc()函数分配单个内存块,calloc()分配多个内存块并将它们初始化为零。
语法:
int *ptr = (cast-type *)calloc(n, element-size);
例子:
int *ptr = (float *) calloc(25, sizeof(float));
在内存中为25个元素分配连续空间,每个元素大小为4个字节。

3)free()释放内存中分配的空间

语法:
free(ptr);

示例1:malloc()和free(),计算用户输入的n个数字的总和。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, *ptr, sum = 0;
    printf("输入的元素总个数:");
    scanf("%d", &n);

    ptr = (int *)malloc(n * sizeof(int));
    //或者使用calloc()申请内存
    //ptr = (int *)malloc(n, sizeof(int));
    
    if (ptr == NULL)
    {
        printf("申请内存出错了!");
        exit(0);
    }

    printf("输入元素:");
    for (i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }

    printf("输入元素的和是:%d\n", sum);
    free(ptr);
    return 0;
}
4) realloc()函数

如果动态分配的内存不足,可以通过realloc()函数更改先前分配的内存大小
语句:
int ptr = realloc(ptr, x)

示例2 realloc()
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *ptr, i, n1, n2;
    printf("输入数组大小:\n");
    scanf("%d", &n1);

    ptr = (int *)malloc(n1 * sizeof(int));

    printf("已经分配的内存地址:");
    for (i = 0; i < n1; ++i)
        printf("%p \n", ptr + i);

    printf("\n输入新的数组大小:");
    scanf("%d", &n2);
    ptr = realloc(ptr, n2 * sizeof(int));

    printf("新分配的内存地址:");
    for (i = 0; i < n2; ++i)
        printf("%p \n", ptr + i);

    return 0;
}

翻译自
c动态内存分配

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章