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

C 使用数组指针对结构进行排序不起作用,c,struct,quicksort,qsort,C,Struct,Quicksort,Qsort,我正在创建两个结构:甲板和卡片。我想使用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));

我正在创建两个结构:甲板和卡片。我想使用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?)。

Hm……您的代码看起来像是“填空”,因为您尚未发布完整的代码,并且发布的代码是正确的。因此,我以某种方式完成了您的代码:

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

当您添加卡时,您的
积分位于需要添加卡的位置。所以你需要在添加后增加它。请记住,您还需要为它添加检查,以防止溢出
Deck->c

Hm….您的代码看起来像是“填空”,因为您尚未发布完整的代码,并且发布的代码是正确的。因此,我以某种方式完成了您的代码:

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

当您添加卡时,您的
积分位于需要添加卡的位置。所以你需要在添加后增加它。请记住,您还需要为它添加检查,以防止溢出
Deck->c

请提供一个复制问题的最小编译示例。您的代码不完整。请添加完整代码。在我的头顶上,你正在访问
卡片
中的
卡片
,而没有分配它……
b->top++;b->c[b->top]=c在添加变量后而不是之前增加变量。请提供一个复制问题的最小编译示例。您的代码不完整。请添加完整代码。在我的头顶上,你正在访问
卡片
中的
卡片
,而没有分配它……
b->top++;b->c[b->top]=c在添加后而不是之前增加变量。