突然感觉自己的C语言基础好差劲。
定义一个二维数组:
char a[8][64];
又有两个函数定义如下:
void testfun1(char **strings, int count);
void testfun2(char strings[][64], int count);
如果把数组a传入到 testfun1 中去,软件挂了。
如果把数组a传入到 testfun2 中去,软件正常。
定义数组a的时候,按照我原先的想法是会在内存中创建一个 char * 类型的数组,名字就叫a,这个数组用于存放每一行数组的首元素的地址,那么a[0]存放的地址为a[0][0]的地址,a[n]存放的地址为a[n][0]的地址。但是事实是没有,二维数组是连续存放在内存中的,使用a[n]的时候,编译器会自己根据每一行占用的大小自己算出来a[n]的值的,而不会创建一个指针数组。
testfun1函数里面,形参 strings 是一个指针数组,这个数组就是我上面臆想出来那个数组,使用的时候会从这个指针数组里面获取各行的起始地址。
但是!如果把数组a传入到testfun1里面,传的是a[0][0]的地址(打印出来a的值和&a[0][0]的值是一样的),然而函数会把a认为是一个指针数组,把里面的数据都看成是指针,但其实里面的数据都是字符串数据,使用的话就会出现错误。
但是!testfun2的函数定义特殊,在函数里面使用a[n][m]的时候,编译器会自动根据行大小来计算a[n][m]的地址,所以把a传入到testfun2函数是没问题的。
那么,想要传个数据到testfun1怎么办?这样(有点傻):
char h0[64];
char h1[64];
char h2[64];
char h3[64];
char h4[64];
char h5[64];
char h6[64];
char h7[64];
char* a[8] = {h0, h1, h2, h3, h4, h5, h6, h7};
testfun1(a);