二维数组作为函数参数

最近花了2小时才定位一个二位数组排序出错的bug,记录一下

1.排序方法

static void fileSort(char **buff,int len)
{
	char *temp;
	int i, j;
  	for (i = 0; i < len; ++i){
	    for (j = i + 1; j < len; ++j){
	       if( strcmp(buff[i], buff[j]) > 0){
	          temp = buff[i];  
	          buff[i] = buff[j]; 
	          buff[j] = temp; 
	       }
	    }
  }	 
}
//打印
void printArray(char **buff, int len){
    int i;
    for (i = 0; i < len; ++i){
        printf("%s\n", buff[i]);
    }
}

2.调用

    char *buff[] = {"video_000000_pts_0.es", "video_000021_pts_62822.es", "video_000460_pts_1376558.es","video_000133_pts_397995.es", "video_000003_pts_8950.es", "video_000007_pts_20926.es"};
    printf("111\n");
    printArray(buff, sizeof(buff) / sizeof(buff[0]));
    printf("222\n");
    fileSort(buff, sizeof(buff) / sizeof(buff[0]));
    printArray(buff, sizeof(buff) / sizeof(buff[0]));

这样是没任何问题的。

但如果是一个二维数组过来,就如下的测试用例。这样就会产生coredump.原因是:

二维数组作为函数参数时要给出二维长度,否则失败

    char fileNameArr[6][1024] = {"video_000000_pts_0.es", "video_000021_pts_62822.es", "video_000460_pts_1376558.es","video_000133_pts_397995.es", "video_000003_pts_8950.es", "video_000007_pts_20926.es"};
   
    printf("111\n");
    printArray(fileNameArr, 6);
    printf("222\n");
    fileSort(fileNameArr, 6);
    printArray(fileNameArr, 6);
    return 0;

改造之:

    char fileNameArr[6][1024] = {"video_000000_pts_0.es", "video_000021_pts_62822.es", "video_000460_pts_1376558.es","video_000133_pts_397995.es", "video_000003_pts_8950.es", "video_000007_pts_20926.es"};
    char *pStr[6]; //降维
    for(i = 0;i <6;i++)
    	pStr[i]=fileNameArr[i];
    	   
    printf("111\n");
    printArray(pStr, 6);
    printf("222\n");
    fileSort(pStr, 6);
    printArray(pStr, 6);
    return 0;

或者改造排序方法,然后使用之前的调用方法 fileSort(fileNameArr,length);

//sort method 1
static void fileSort(gchar buff[][1024],int len)
{
  int i, j;
  char *temp;
	
  for (i = 0; i < len; i++){
    for (j = i + 1; j < len; j++){
       if( strcmp(buff[i], buff[j]) > 0){
          strcpy(temp,buff[i]); //为何使用strcpy,那是因为进行值拷贝
          strcpy(buff[i],buff[j]);
          strcpy(buff[j],temp);
       }
    }
  }	 
}

//改造之前

// //sort method 2  二维数组调用的时候,必须指定数组参数(实参)
// static void fileSort(gchar **buff,int len)
// {
//   int i, j;
//   char *temp;
	
//   for (i = 0; i < len; i++){
//     for (j = i + 1; j < len; j++){
//        if( strcmp(buff[i], buff[j]) > 0){
//           temp=buff[i];
//           buff[i]=buff[j];
//           buff[j]=temp;
//        }
//     }
//   }	 
// }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值