c语言中数组元素长度的获取和遇到的坑解决办法

吐槽

作为java开发者的我用c还是有很多不习惯的,遇到很多问题,解决起来真心累,而且我这是安卓转jni转c,一层一层的调试出问题可真心累啊,
直接用sizeof是没法测量出长度的,需要除以其中一个元素的长度才能得到真实的长度,但是作为形参传递又没法测量了,下面是一系列举例和解决办法。

如果数组不作为参数传递,那么取长度的代码是:

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变量为实际元素长度,
如果作为参数传递,那么此方法行不通了。

第二种方法 有点影响执行效率,越长就效率越低

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语言,因为我还有很多很多事情要做,而且有些东西没有用到很快就会遗忘,如果不忘记的话,我会考虑花时间系统的学习。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值