[英]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.