首页 > 编程笔记

C语言malloc函数:动态内存分配

C语言中的 malloc 函数是一种动态内存分配函数,可以在程序运行时在堆上分配一段指定大小的内存空间,并返回指向该内存空间的指针。这个函数非常有用,特别是当我们需要创建动态数据结构时,例如链表和树等。

malloc 函数是 C语言标准库中的函数,其原型如下:
void *malloc(size_t size);
函数原型中,参数 size 指定需要分配的内存空间大小,以字节为单位。该函数返回的是一个 void 类型的指针,即 void *。因为 malloc 函数返回的是一个 void 指针,所以需要将其转换为需要的指针类型,例如 int *、char * 等。

下面是一些使用 malloc 函数的示例:

1) 动态分配一维数组

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, i;
    printf("请输入数组长度:");
    scanf("%d", &n);
    int *arr = (int*)malloc(n * sizeof(int));
    for (i = 0; i < n; i++) {
        arr[i] = i + 1;
    }
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    free(arr);
    return 0;
}
上面的代码中,我们首先从用户输入中读取数组的长度 n,然后使用 malloc 函数动态分配了一个长度为 n 的整型数组。接着,我们使用 for 循环给数组中的每个元素赋值,并打印输出数组中的每个元素。最后,我们使用 free 函数释放了这段内存空间。

这是程序的输出:

请输入数组长度:5
1 2 3 4 5

2) 动态分配二维数组

#include <stdio.h>
#include <stdlib.h>

int main() {
    int m, n, i, j;
    printf("请输入二维数组的行数和列数:");
    scanf("%d%d", &m, &n);
    int **arr = (int**)malloc(m * sizeof(int*));
    for (i = 0; i < m; i++) {
        arr[i] = (int*)malloc(n * sizeof(int));
        for (j = 0; j < n; j++) {
            arr[i][j] = i * n + j + 1;
        }
    }
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
        free(arr[i]);
    }
    free(arr);
    return 0;
}
上面的代码中,我们首先从用户输入中读取二维数组的行数 m 和列数 n,然后使用 malloc 函数动态分配了一个 m 行 n 列的整型数组。为了实现二维数组的动态分配,我们首先分配一个指针数组,其中每个元素都指向一行的数组,然后在循环中为每行分配一个 n 个整型元素的数组,并将该指针赋值给指针数组中的每个元素。

接着,我们使用 for 循环给数组中的每个元素赋值,并打印输出数组中的每个元素。在输出完每行的元素后,我们使用 free 函数释放了该行数组所占的内存空间。

这是程序的输出:

请输入二维数组的行数和列数:3 4
1 2 3 4
5 6 7 8
9 10 11 12

3) 动态分配结构体数组

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char name[20];
    int age;
} Person;

int main() {
    int n, i;
    printf("请输入人数:");
    scanf("%d", &n);
    Person *people = (Person*)malloc(n * sizeof(Person));
    for (i = 0; i < n; i++) {
        printf("请输入第%d个人的姓名和年龄:", i + 1);
        scanf("%s%d", people[i].name, &people[i].age);
    }
    for (i = 0; i < n; i++) {
        printf("第%d个人的姓名为%s,年龄为%d\n", i + 1, people[i].name, people[i].age);
    }
    free(people);
    return 0;
}
上面的代码中,我们首先从用户输入中读取人数 n,然后使用 malloc 函数动态分配了一个长度为 n 的 Person 结构体数组。接着,我们使用 for 循环依次输入每个人的姓名和年龄,并打印输出每个人的姓名和年龄。最后,我们使用 free 函数释放了这段内存空间。

这是程序的输出:

请输入人数:3
请输入第1个人的姓名和年龄:张三 20
请输入第2个人的姓名和年龄:李四 30
请输入第3个人的姓名和年龄:王五 40
第1个人的姓名为张三,年龄为20
第2个人的姓名为李四,年龄为30
第3个人的姓名为王五,年龄为40

4) 动态分配字符串

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int n, i;
    printf("请输入字符串的个数:");
    scanf("%d", &n);
    char **strs = (char**)malloc(n * sizeof(char*));
    for (i = 0; i < n; i++) {
        printf("请输入第%d个字符串:", i + 1);
        char buf[100];
        scanf("%s", buf);
        strs[i] = (char*)malloc((strlen(buf) + 1) * sizeof(char));
        strcpy(strs[i], buf);
    }
    for (i = 0; i < n; i++) {
        printf("%s\n", strs[i]);
        free(strs[i]);
    }
    free(strs);
    return 0;
}
上面的代码中,我们首先从用户输入中读取字符串的个数 n,然后使用 malloc 函数动态分配了一个长度为 n 的 char 指针数组。接着,我们使用 for 循环依次输入每个字符串,并使用 strlen 函数计算字符串长度,然后使用 malloc 函数动态分配一个足够大的 char 数组,再使用 strcpy 函数将输入的字符串拷贝到新分配的内存空间中。最后,我们使用 for 循环依次输出每个字符串,并使用 free 函数释放每个字符串所占的内存空间,最后使用 free 函数释放指针数组所占的内存空间。

这是程序的输出:

请输入字符串的个数:3
请输入第1个字符串:hello
请输入第2个字符串:world
请输入第3个字符串:c programming
hello
world
c programming

5) 动态分配二维字符数组

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, m, i, j;
    printf("请输入二维字符数组的行数和列数:");
    scanf("%d%d", &n, &m);
    char **matrix = (char**)malloc(n * sizeof(char*));
    for (i = 0; i < n; i++) {
        matrix[i] = (char*)malloc(m * sizeof(char));
        printf("请输入第%d行的%d个字符:", i + 1, m);
        for (j = 0; j < m; j++) {
            scanf(" %c", &matrix[i][j]);
        }
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            printf("%c ", matrix[i][j]);
        }
        printf("\n");
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}
上面的代码中,我们首先从用户输入中读取二维字符数组的行数 n 和列数 m,然后使用 malloc 函数动态分配了一个长度为 n 的 char 指针数组。接着,我们使用 for 循环依次为每一行动态分配一个长度为 m 的 char 数组,并使用 for 循环依次输入每个字符。在每行字符输入完成后,我们使用 for 循环依次输出每个字符,并使用 free 函数释放每行所占的内存空间。最后,我们使用 free 函数释放指针数组所占的内存空间。

这是程序的输出:

请输入二维字符数组的行数和列数:3 4
请输入第1行的4个字符:a b c d
请输入第2行的4个字符:e f g h
请输入第3行的4个字符:i j k l
a b c d
e f g h
i j k l

总结

以上是关于 C语言中 malloc 函数的使用及示例代码的介绍。malloc 函数是 C语言中用于动态分配内存空间的重要函数,能够帮助我们更加灵活地管理内存空间。当我们需要动态分配数组、结构体、字符串或者二维数组时,都可以使用 malloc 函数来实现。在使用 malloc 函数时,我们需要注意动态分配的内存空间的大小,以及在使用完毕后要及时释放内存空间,避免内存泄漏问题。

需要注意的是,使用 malloc 函数动态分配的内存空间不会自动初始化为 0。因此,在使用 malloc 函数动态分配内存空间后,我们需要根据实际情况手动初始化内存空间。另外,当我们使用 malloc 函数动态分配内存空间后,如果需要调整内存空间的大小,可以使用 realloc 函数来实现。

在使用 malloc 函数时,我们需要对 malloc 函数的返回值进行判断,以确保内存分配成功。如果 malloc 函数返回的指针为 NULL,说明内存分配失败,此时我们需要考虑如何处理内存分配失败的情况,比如输出错误信息并退出程序。

总之,malloc 函数是 C语言中非常重要的函数,熟练掌握 malloc 函数的使用可以帮助我们更加灵活地管理内存空间,提高程序的效率和稳定性。

推荐阅读