【问题标题】:Sorting a struct with array pointer is not working使用数组指针对结构进行排序不起作用
【发布时间】:2019-12-20 06:39:40
【问题描述】:

我正在创建两个结构: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?)。

【问题讨论】:

  • 请提供重现问题的最小编译示例。
  • 您的代码不完整。请添加完整代码。在我的脑海中,您正在访问Deck 中的Card 而不分配它....
  • b->top++; b->c[b->top] = c; 增加变量添加之后,而不是之前。

标签: c struct quicksort qsort


【解决方案1】:

嗯....您的代码看起来像是“填空”,因为您尚未发布完整的代码并且您发布的代码是正确的。所以我以一种可行的方式完成了你的代码:

#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-&gt;c 溢出。

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 2021-08-02
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2012-02-25
    相关资源
    最近更新 更多