And*_*ndy 8 c arrays string qsort segmentation-fault
一些前言:我是一名计算机工程专业的学生,经过3个学期的Java(直到数据结构),在C学习第一堂课.这个问题与家庭作业有关,但是为我解决了一些步骤.
我有一个输入文件,我读入内存,它存储在char [9] [500].我读入最多500个最大长度为8的字符串.我试图使用stdlib内置的qsort()函数对这个数组进行排序,并且有一些内存错误.
重要的代码片段:
char data[4][500][60];
char debug[500][9];
size_t count = 0;
/* initialize file, open for reading */
FILE* pUserlog;
pUserlog = fopen("userlog","r");
while(!feof(pUserlog))
{
fscanf(pUserlog, "%9s %8s %16s",debug[count], data[1][count], data[2][count]);
fgets(data[3][count], 60, pUserlog);
count++;
}
Run Code Online (Sandbox Code Playgroud)
此部分将数据读入阵列.这部分感兴趣的数组是"debug".这是上面指定的数组.这是我的qsort比较函数:
int compare(const void* a, const void* b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
puts("I'm in compare!");
return strncmp(*ia, *ib,8);
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试调用qsort:
size_t debug_len = sizeof(debug)/sizeof(char*);
printf("debug len: %d, count: %d, sizeof(char*): %d\n",debug_len,count,sizeof(char*));
qsort(debug,count, sizeof(char *), compare);
Run Code Online (Sandbox Code Playgroud)
我尝试在我的调用中替换debug_len,其中count是,但我仍然是segfaulting.这是输出:
$ ./test debug len: 1125, count: 453, sizeof(char*): 4 I'm in compare! Segmentation fault (core dumped)
谢谢!
compare函数将接收指向要比较的元素的指针.您正在尝试使用比较字符strncmp()
.由于您有指向每个字符串的指针,因此将其强制转换为a char *
并进行比较.
int compare(const void* a, const void* b)
{
const char *ia = (const char *)a;
const char *ib = (const char *)b;
puts("I'm in compare!");
return strncmp(ia, ib, 9);
}
Run Code Online (Sandbox Code Playgroud)
还要记住,它是一个数组数组,而不是一个指针数组.所以元素的大小应该是数组的大小,9
而不是指针的大小4
.此时,sizeof debug[0]
由于它是一个二维数组,因此更容易使用.如果你没有使用正确的尺寸,qsort()
只会破坏你的阵列.
size_t elemsize = sizeof debug[0]; /* 9 - size of each element */
size_t count = sizeof(debug)/elemsize; /* 500 - number of elements in array */
qsort(debug, count, elemsize, compare);
Run Code Online (Sandbox Code Playgroud)