簡體   English   中英

將結構指針分配給雙指針結構

[英]Assign a Struct Pointer to Double Pointer Struct

問題:創建帶有雙指針的結構,以便在不更改每張卡的存儲位置的情況下對卡進行排序。

這些卡在程序的其他部分中使用。

圖解:

 *deck           .**card    .n_cards 
 +------+       +--------+----+
 |  x---|------>|  x     | 3  |
 +------+       +--------+----+
                   |              +-----+
                   +------------->|  x  |
                                  +-----+
                  .value .suit       |
                    +----+---+       |
                    |    |   |<------+
                    +----+---+
                    |    |   |
                    +----+---+
                    |    |   |
                    +----+---+

碼:

struct card_tag {
  unsigned value;
  suit_t suit;
};typedef struct card_tag card_t;

struct deck_tag {
  card_t ** cards;
  size_t n_cards;
};
typedef struct deck_tag deck_t;

void add_card_to(deck_t * deck, card_t c){
  deck->n_cards++;
  deck->cards = realloc(deck->cards, (deck->n_cards)*sizeof(*deck->cards));
  card_t * new_c = malloc(sizeof(*new_c));
  *new_c = c;
  deck->cards[deck->n_cards-1] = new_c;
  return;
}

代碼正在編譯,沒有錯誤,但是排序改變了卡的內存地址。

我用來將**卡鏈接到struct卡的方法是正確的方法嗎?

為了對卡片進行排序,我使用了qsort。

qsort(hand2->cards, hand2->n_cards, sizeof(card_t), card_ptr_comp);

如果您的目標是對card_t **類型的hand2->cards進行排序,則需要將sizeof(card_t*)傳遞給qsort ,並確保您的比較函數接受card_t **作為輸入。

qsort(hand2->cards, hand2->n_cards, sizeof *hand2->cards, card_ptr_comp);

int card_ptr_comp(const void * a, const  void * b)
{
    const card_t* card_a = *(const card_t**)a;
    const card_t* card_b = *(const card_t**)b;

    return card_a->suit - card_b->suit;
}

(更新)

在調用add_card_to 3次之后,此圖也許可以闡明您分配的內容。 您將使deck->cards指向內存中包含三個指針的塊,並且每個指針都指向單獨分配的卡。

qsort調用當前正在對指針數組重新排序,即,在deck->cards指向的數組內交換指針的順序 由於在64位計算機上, sizeof(card_t)等於sizeof(card_t*) ,因此它也偶然sizeof(card_t)

                 card_t**
 *deck           .cards  .n_cards 
 +------+       +--------+----+
 |  x---|------>|  x     | 3  |
 +------+       +--------+----+   YOU ARE REORDERING THIS:
                   |              card_t* card_t* card_t*
                   |              +-----+-----+-----+
                   +------------->|  x  |  y  |  z  |
                                  +-----+-----+-----+
                  .value .suit       |     |     |
                    +----+---+       |     |     |
                    |    |   |<------+     |     |
                    +----+---+             |     |
                                           |     |
                  .value .suit             |     | 
                    +----+---+             |     |
                    |    |   |<------------+     |
                    +----+---+                   |
                                                 |
                  .value .suit                   | 
                    +----+---+                   |
                    |    |   |<------------------+
                    +----+---+                   

您的add_card_to函數還將結構值復制到堆分配的空間中。 這意味着添加到卡座中的卡與主程序中的卡不同。

如果還在此功能之外分配卡,則需要將功能更改為:

void add_card_to(deck_t * deck, card_t * c)
{
    deck->n_cards++;
    deck->cards = realloc(...);
    deck->cards[deck->n_cards - 1] = c;
}

暫無
暫無

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

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