我正在编写一个小代码来测试未完全填充的数组上的qsort。
但每当我运行它时,数据都会被完全删除一些随机的int。
我不明白为什么,我看了this question并且他们的代码运行良好,但我不知道为什么我的赢了。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct proc {
long unsigned int user_time;
long unsigned int system_time;
char *name;
int pid;
};
static int compare(const void * a, const void * b)
{
const struct proc *p1 = a;
const struct proc *p2 = b;
if ((p1->system_time + p1->user_time) > (p2->user_time + p2->system_time))
return -1;
else if ((p1->system_time + p1->user_time) == (p2->user_time + p2->system_time))
return 0;
else
return 1;
}
int main()
{
int used_size = 0;
srand ( time(NULL) );
struct proc **processes = malloc(sizeof(struct proc*) * 20 + 1);
for (int i = 0; i < 20; i++) {
processes[i] = malloc(sizeof(struct proc));
processes[i]->user_time = 0;
processes[i]->system_time = 0;
processes[i]->name = NULL;
processes[i]->pid = -1;
}
for (int i = 0; i < 14; i++)
{
processes[i]->user_time = rand()%10;
processes[i]->system_time = 0;
processes[i]->pid = i*2;
used_size++;
}
for (int i = 0; i < used_size;i++)
{
printf("%d %lu \n",i,processes[i]->user_time);
}
printf("\n\n\n");
qsort(processes, used_size, sizeof(struct proc *), compare);
for (int i = 0; i < used_size;i++)
{
printf("%d %d \n",i,processes[i]);
}
}
答案 0 :(得分:0)
感谢德米特里:
参数将是指向数组中被比较的元素的指针,它们本身是指向结构的指针(在你的设置中)......所以它们应该是指针的指针,尽管你把它们视为指向它们直接结构。
问题在于“比较”功能:
static int compare(const void * a, const void * b)
{
const struct proc *p1 = *(struct proc **)a;
const struct proc *p2 = *(struct proc **)b;
// 0ull to prevent int overflow
if ((0ull + p1->system_time + p1->user_time) > (0ull + p2->user_time + p2->system_time))
return -1;
else if ((0ull + p1->system_time + p1->user_time) == (0ull + p2->user_time + p2->system_time))
return 0;
else
return 1;
}