首页 > 编程笔记

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 函数的使用可以帮助我们更加灵活地管理内存空间,提高程序的效率和稳定性。

推荐阅读

副业交流群 关注微信公众号,加入副业交流群,学习变现经验,交流各种打法。