利用malloc函数分配二维数组

        利用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;
}

 程序输出:

         由程序输出可以得出,每一行是连续的,但相邻行却不是连续的,符合上面的解释。

总结:利用这种方法分配的内存只要一行一行是连续的,但整体不会像声明的二维数组那样整体连续。