最近花了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;
// }
// }
// }
// }