使用数组指针对结构进行排序不起作用

Sorting a struct with array pointer is not working

我正在创建两个结构:Deck 和 Card。我想使用 qsort 对甲板上的卡片进行排序,但这不起作用。当我 运行 发生异常:分段错误。 按照我的代码:

typedef struct Card {
   int value;
}Card;

typedef struct Deck{
   Card *c[100];
   int top;
}Deck;

Card * newCard(int value) {
   Card * aux = (Card *)malloc(sizeof(Card));
   aux->value = value;

   return aux;
}

Deck * newDeck() {
   Deck * deck = (Deck *)malloc(sizeof(Deck));
   deck->top = 0;

   return deck;
}

void addCard(Deck *b, Card *c) {
   b->top++;
   b->c[b->top] = c;
}

int compare(const void *x, const void *y) {
   Card * xa = *(Card **) x;
   Card * ya = *(Card **) y;

   if(xa->value == ya->value)
      return 0;

   if(xa->value > ya->value)
      return 1;

   return -1;
}

void sort(Deck *b) {
   qsort(b->c, b->top, sizeof(struct Card*), compare);
}

int main() {
   Deck * b = newDeck();
   addCard(b,newCard(11));
   addCard(b,newCard(12));
   addCard(b,newCard(11));
   addCard(b,newCard(1));
   addCard(b,newCard(1));

   sort(b);

   return 0;
}

有人可以帮助我吗?我只想对甲板上的卡片进行排序,但逻辑有问题。可能类似于指针(malloc 或 calloc?)。

嗯....你的代码看起来像 "fill in the blanks",因为你没有发布完整的代码,你发布的代码是正确的。因此,我以有效的方式完成了您的代码:

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

// Your code
typedef struct Card {
   int value;
}Card;

typedef struct Deck{
   Card *c[100];
   int top;
}Deck;

int compare(const void *x, const void *y) {
   Card*  xa = *(Card **) x;
   Card*  ya = *(Card **) y;

   if(xa->value == ya->value)
      return 0;

   if(xa->value > ya->value)
      return 1;

   return -1;
}

void sort(Deck *b) {
   qsort(b->c, b->top, sizeof(struct Card*), compare);
}

// My main
int main() {
    Deck d;
    d.c[0] = calloc(1, sizeof(Card));
    d.c[0]->value = 5;
    d.c[1] = calloc(1, sizeof(Card));
    d.c[1]->value = 1;
    d.c[2] = calloc(1, sizeof(Card));
    d.c[2]->value = 3;
    d.top = 3;
    sort(&d);
    printf("%d %d %d", d.c[0]->value, d.c[1]->value, d.c[2]->value);
    return 0;
}

我对你的分段错误的猜测是你正在访问 Card 没有分配它

更新:

您的 addCard() 不正确。这是正确的:

void addCard(Deck *b, Card *c) {
   b->c[b->top] = c;
   b->top++;
}

当您添加卡片时,您的 top 点将放置您需要添加卡片的位置。所以你需要在添加后增加它。请记住,您也需要为其添加检查以防止溢出 Deck->c.