簡體   English   中英

帶有struct數組的Qsort會更改結構的內容

[英]Qsort with array of struct changes the content of the struct

我正在編寫一個小代碼來測試未完全填充的數組上的qsort。

但每當我運行它時,數據都會被完全刪除,因為某些隨機int。

我不明白為什么,我看了這個問題 ,他們的代碼運行良好,但我不知道為什么我的不會。

#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]);
    }


}

感謝德米特里:

參數將是指向數組中被比較的元素的指針,它們本身是指向結構的指針(在你的設置中)......所以它們應該是指針的指針,盡管你把它們視為指向結構的指針直。

問題在於“比較”功能:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM