利用malloc()函数分配的内存是连续的的,我们可以先分配二维数组的行(即行指针),然后利用分配的行指针,再分配列指针。咱们以分配一个4x5的二维数组为例,如下图():
1、先分配连续的4块内存作为行,这些分配内存是连续的,并将S指向它
S = (char**)malloc(sizeof(char*) * row);
2、利用之前分配好的4块内存,每块内存(即对应的行)再分配5块内存作为列,每行指向对应分配好的5块内存(相当列)
for (i = 0; i < row; i++)
S[i] = (char*)malloc(sizeof(char) * col);
注:每一行分配的内存是连续,但相邻两行的内存不一定连续(由于每次用malloc()给一行分配内存(这行内存分配的内存是连续的),下一次给下一行分配内存,不一定紧接着上一行最后的内存的地址,故相邻两行的内存不一定连续,即整体不连续)
3、测试程序
/*获取的二维数组,只有一行一行是连续的,但整体不是连续的*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char** S;
int row, col, i, j;
printf("请输入你需要创建的二维数组的行和列!!!\n");
printf("请输入行:");
scanf("%d", &row);
printf("请输入列:");
scanf("%d", &col);
/*利用malloc申请内存*/
S = (char**)malloc(sizeof(char*) * row); // 分配行
for (i = 0; i < row; i++)
S[i] = (char*)malloc(sizeof(char) * col); // 分配列
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
printf("%p ", &S[i][j]);
printf("\n");
}
/*利用malloc()函数分配的内存在程序退出时,不要忘了利用free()函数释放
要不容易造成内存泄漏*/
/*释放申请的内存*/
for (i = 0; i < row; i++) // 先释放分配的列
free(S[i]);
free(S); // 再释放分配的行
return 0;
}
程序输出:
由程序输出可以得出,每一行是连续的,但相邻行却不是连续的,符合上面的解释。
总结:利用这种方法分配的内存只要一行一行是连续的,但整体不会像声明的二维数组那样整体连续。