簡體   English   中英

使用qsort進行C數組排序?

[英]C array sorting using qsort?

我已經堅持了一段時間,似乎沒有任何效果。

我有一個數據結構:

DATA
{
  int size;
  int id;
}

我有一組數據結構:

myArray = (DATA *) malloc(10 * sizeof(DATA));

然后我分配一些測試值:

myArray[0].size = 5;
myArray[1].size = 9;
myArray[2].size = 1;
myArray[3].size = 3;

所以我的起始數組應該是這樣的:

5,9,1,3,0,0,0,0,0,0

然后,我調用qsort(myArray,10,sizeof(DATA),comp)

comp 是:

  int comp(const DATA * a, const DATA * b)
{
    return a.size - b.size;
}

相信我,我用比較功能嘗試了很多東西,但似乎沒有任何效果。 我從來沒有得到任何有意義的排序。

所以我的起始數組應該看起來像 5, 9, 1, 3, 0, 0, 0, 0, 0, 0。

不,它真的不會,至少它不能保證。

如果您想要零,請使用calloc()將所有內容清零,或者自己將它們放入。 malloc()將為您提供一個所需大小的塊,該塊具有不確定的內容。 換句話說,它很可能預先存儲了內存中的任何垃圾。

而且,最重要的是, ab是您的comp函數中的指針,您應該使用->而不是. 使用正確的原型進行鑄造是一種很好的形式。

最后一點:請不要在 C 中轉換malloc的返回值 - 如果您不小心忘記包含相關的頭文件並且您的整數與您的指針不兼容,您可能會遇到問題。

malloc函數返回一個void * ,它會很高興地將隱式轉換為任何其他指針。


這是一個帶有這些修復程序的完整程序:

#include <stdio.h>
#include <stdlib.h>

typedef struct {int size; int id;} DATA;

int comp (const void *a, const void *b) {
    return ((DATA *)a)->size - ((DATA *)b)->size;
}

int main (void) {
    int i;
    DATA *myArray = malloc(10 * sizeof(DATA));
    myArray[0].size = 5;
    myArray[1].size = 9;
    myArray[2].size = 1;
    myArray[3].size = 3;
    for (i = 4; i < 10; i++)
        myArray[i].size = 0;

    qsort (myArray, 10, sizeof(DATA), comp);
    for (i = 0; i < 10; i++)
        printf ("%d ", myArray[i].size);
    putchar ('\n');

    return 0;
}

輸出:

0 0 0 0 0 0 1 3 5 9

暫無
暫無

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

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