为什么出错了,,没有输出
我看出了他的malloc错了,我的想法是总共有6*30个char所以我写了如下代码:
从这里可以看出我对于二维数组的理解是连续的一块内存,我以为二维数组跟一维数组一样是连续的,把内存的首地址给这个二级指针就可以正常使用了,但是我错了。经过一系列的讨论和验证终于理清了二维数组的结构,实际上二维数组可以看成是由若干个一维数组组成的,这其实大家都可以理解,关键是二维数组的外层还有一个数组,他所存储的是下面那些一维数组的首地址,故二维数组需要的空间就不止sizeof(char)*3*30了,还要包含三个指针sizeof(char *)*3;还有一个需要注意的地方是,虽然我们申请了这些空间但是他们仍然是毫无关联的一些内存块,要想将二级指针像二维数组名一样使用我们还得将指针和一维数组关联起来这样才能够正常使用。所以二维数组的动态分配第一步是分配内存,第二步是关联指针。需要说明的一点是二维数组拷贝也要分级拷贝。下面是一种二维数组的动态分配的方法,供大家参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void function(char ** ptr)
{
char arr[3][30] = {
"abc",
"def",
"ghi"
};
int i = 0;
for(i = 0; i < 3; i++)
memcpy(ptr[i], arr[i], sizeof(char)*30);
}
int main()
{
int i = 0;
int j = 0;
//printf("hello word\n");
char **ptr = NULL;
ptr = (char **)malloc(sizeof(char *)*3);
for(i = 0; i < 3; i++)
*(ptr+i) = (char *)malloc(sizeof(char)*30);
function(ptr);
#if 1
for(i = 0; i < 3; i++)
printf(" %s \n", ptr[i]);
#endif
for(i = 0; i < 3; i++)
free(ptr[i]);
return 0;
}
二维数组虽然我们说他是不连续的空间。但是如果你愿意也可以尝试如下做法,将二维数组变成一个连续的内存块,但是其原理没有变仍然需要将指针和一维数组关联,只不过认为的将内存挪到了一起。代码如下:
欢迎加入C语言交流群 461097775