首页 > 编程笔记
C语言malloc函数:动态内存分配
C语言中的 malloc 函数是一种动态内存分配函数,可以在程序运行时在堆上分配一段指定大小的内存空间,并返回指向该内存空间的指针。这个函数非常有用,特别是当我们需要创建动态数据结构时,例如链表和树等。
malloc 函数是 C语言标准库中的函数,其原型如下:
下面是一些使用 malloc 函数的示例:
这是程序的输出:
接着,我们使用 for 循环给数组中的每个元素赋值,并打印输出数组中的每个元素。在输出完每行的元素后,我们使用 free 函数释放了该行数组所占的内存空间。
这是程序的输出:
这是程序的输出:
这是程序的输出:
这是程序的输出:
需要注意的是,使用 malloc 函数动态分配的内存空间不会自动初始化为 0。因此,在使用 malloc 函数动态分配内存空间后,我们需要根据实际情况手动初始化内存空间。另外,当我们使用 malloc 函数动态分配内存空间后,如果需要调整内存空间的大小,可以使用 realloc 函数来实现。
在使用 malloc 函数时,我们需要对 malloc 函数的返回值进行判断,以确保内存分配成功。如果 malloc 函数返回的指针为 NULL,说明内存分配失败,此时我们需要考虑如何处理内存分配失败的情况,比如输出错误信息并退出程序。
总之,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 函数的使用可以帮助我们更加灵活地管理内存空间,提高程序的效率和稳定性。