简书链接:c语言中数组元素长度的获取和遇到的坑解决办法 文章字数:856,阅读全文大约需要3分钟
吐槽 作为java开发者的我用c还是有很多不习惯的,遇到很多问题,解决起来真心累,而且我这是安卓转jni转c,一层一层的调试出问题可真心累啊, 直接用sizeof是没法测量出长度的,需要除以其中一个元素的长度才能得到真实的长度,但是作为形参传递又没法测量了,下面是一系列举例和解决办法。
如果数组不作为参数传递,那么取长度的代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int ints []= int ints []={ 1800,2196,2244,2236,1988, 2264,2204,2240,2196,2204, 2240,2264,1988,2236,2236, 1988,2248,2232,2268,2212, 2220,2240,1988,2260,2220 ,2212,2216,2264,1988,2232, 2288,2196,2244,2200,2204, 1988,2196}; int firstArrLength=sizeof ints[0]; int measureLength=sizeof ints; int length=sizeof ints/firstArrLength ; //一个元素的大小 就是类似ints[0] printf("真实 arr length:%d, 测量长度 %d,first arr length:%d ",length,measureLength,firstArrLength); printf("test function:%d ",arrActualLength(ints));//37个元素
上面代码中,length变量为实际元素长度, 如果作为参数传递,那么此方法行不通了。
第二种方法 有点影响执行效率,越长就效率越低
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 int classSign []={1800,2196,2244,2236,1988,2264,2204,2240,2196,2204,2240,2264,1988,2236,2236,1988,2248,2232,2268,2212,2220,2240,1988,2260,2220,2212,2216,2264,1988,2232,2288,2196,2244,2200,2204,1988,2196,-1}; /** * 返回实际上数组个数 需要给最后一个元素做一个标记为 -1 * @param arr * @return */ static int intArrActualLength(int arr[]) { //作为形参传递 这样依然没法测量实际的长度 /* int firstArrLength = sizeof arr[0]; int measureLength=sizeof arr; int length = sizeof arr / firstArrLength; return length; */ int *p; p=arr; int num=0; while((*p)!=-1) { ++num; p++; } return num; }
对于字符串的数组同样可以用此种方法,比如最后一个元素声明为NULL
学习生涯 对于java开发者的我不可能系统的去学习c语言,因为我还有很多很多事情要做,而且有些东西没有用到很快就会遗忘,如果不忘记的话,我会考虑花时间系统的学习。