malloc的知识:动态内存管理相关的四种函数-CSDN博客
在C语言中,malloc
函数用于动态内存分配。对于二维数组,你不能直接分配一个连续的二维数组块,因为malloc
只接受一维大小。但你可以分配一个指向指针数组的指针,然后每个指针指向一个一维数组。
因为是一个指向指针数组的指针,所以该指针是一个二级指针。我们要打印一个三行五列的数组,所以二级指针ps指向一个有着三个一级指针的指针数组。而每个一级指针又是一个有着五个变量的一维数组。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int** ps;
int i, j;
ps = (int**)malloc(3 * sizeof(int*));
if (ps == NULL)
{
perror("malloc fail");
return 1;
}
//空间开辟成功
for (i = 0; i < 3; i++)
{
ps[i] = (int*)malloc(5 * sizeof(int));
if (ps[i] == NULL)
{
//如果某个分配失败,释放之前已分配的内存
perror("malloc fail");
for (j = 0; j < i; j++)
{
free(ps[j]);
}
free(ps);
return 1;
}
}
return 0;
}
这里,每个一级指针分配5个整型的空间,如果有某一个变量分配失败,需要将开辟的空间free掉。
//访问空间
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
ps[i][j] = i * 5 + j;
printf("%d ", ps[i][j]);
}
printf("\n");
}
for (i = 0; i < 3; i++)
{
free(ps[i]);
}
free(ps);
ps = NULL;
访问空间就是正常的访问,就是要记得使用完空间后,及时将动态开辟的空间free掉。
完整代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int** ps;
int i, j;
ps = (int**)malloc(3 * sizeof(int*));
if (ps == NULL)
{
perror("malloc fail");
return 1;
}
//空间开辟成功
for (i = 0; i < 3; i++)
{
ps[i] = (int*)malloc(5 * sizeof(int));
if (ps[i] == NULL)
{
//如果某个分配失败,释放之前已分配的内存
perror("malloc fail");
for (j = 0; j < i; j++)
{
free(ps[j]);
}
free(ps);
return 1;
}
}
//访问空间
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
ps[i][j] = i * 5 + j;
printf("%d ", ps[i][j]);
}
printf("\n");
}
for (i = 0; i < 3; i++)
{
free(ps[i]);
}
free(ps);
ps = NULL;
return 0;
}