簡體   English   中英

帶有指向空指針的qsort

[英]qsort with pointer to pointer to void

qsort在這里工作,但是如果數組v每個成員都占用sizeof(void *) ,為什么qsort期望sizeof(int)

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

int comp(const void *pa, const void *pb)
{
    int a = *(int *)pa;
    int b = *(int *)pb;

    if (a > b)
        return +1;
    else
    if (b > a)
        return -1;
    else
        return 0;
}

int main(void)
{
    int i, a[] = {3, 1, 2, 0, 4};
    void **v;

    v = malloc(sizeof(void *) * 5);
    for (i = 0; i < 5; i++) {
        v[i] = &a[i];
    }
    for (i = 0; i < 5; i++) {
        printf("%d\n", *(int *)v[i]);
    }
    qsort(v[0], 5, sizeof(int), comp); // why sizeof(int) if v is void **
    printf("Sorted:\n");
    for (i = 0; i < 5; i++) {
        printf("%d\n", *(int *)v[i]);
    }
    free(v);
    return 0;
}
qsort(v[0], 5, sizeof(int), comp); // why sizeof(int) if v is void **

您傳遞給qsort要排序的內存塊的開始地址是

v[0] = &a[0]

的初始元素的地址a ,這樣就排序是陣列a ,而不是它的初始元件塊v點。 a的元素是int ,因此sizeof(int)是正確的大小。

如果要對指針數組進行排序,則需要將數組中的第一個元素的地址&v[0]或簡單地v傳遞給qsort 然后當然,size參數必須是sizeof (void*)

qsort(v, 5, sizeof(void*), cmp);

但是為此,您不能使用已有的比較功能,需要

int cmp(const void *pa, const void *pb) {
    int a = *(int*)(*(void**)pa);
    int b = *(int*)(*(void**)pb);

    if (a > b)
        return +1;
    else
    if (b > a)
        return -1;
    else
        return 0;
}

或類似的東西。 由於從qsort傳遞到比較函數的是要比較的對象的地址,因此我們需要一種間接方式來獲取要比較的指針,並且由於這里我們要根據指針所指向的int值來比較指針,因此我們需要第二種間接獲取指向的int

暫無
暫無

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

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