【C语言】定义二维数组并不会在创建一个指针数组

突然感觉自己的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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值