【发布时间】:2018-09-18 12:51:37
【问题描述】:
我的代码中有 2 个结构; card(value, suit) 和 deck(**cards, n),我正在尝试洗牌。
在 shuffle() 函数的 for 循环内。
第一张卡片之后的第i张卡片保存在temp_card。
随机选择一张卡片并将其分配给第 i 张卡片。
temp_card 分配给随机卡片。
问题是程序在这一行停止执行可能是由于分段错误。
**(d->cards + i) = **(d->cards + random_number);
我尝试使用 gdb 进行调试,但不是很具体。这是代码。我还向main() 添加了一些卡片和卡片组以对其进行测试,但我对 C 语言还很陌生,所以我可能还会搞砸这些指针的内存位置。
我的洗牌方法是否正确,或者我应该改变它,为什么程序停在该行,是因为我提供的指针无效吗?
#include <stdio.h>
#include <stdlib.h>
#define VALUE_ACE 14
#define VALUE_KING 13
#define VALUE_QUEEN 12
#define VALUE_JACK 11
typedef enum {
SPADES,
HEARTS,
DIAMONDS,
CLUBS,
NUM_SUITS
} suit_t;
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 shuffle(deck_t * d){
card_t temp_card;
int n = d->n_cards;
int random_number;
for (int i = 0; i < n; i++){
temp_card = **(d->cards + i);
random_number = rand() % n;
**(d->cards + i) = **(d->cards + random_number);
**(d->cards + random_number) = temp_card;
}
}
int main(){
deck_t deck;
card_t card1;
card1.suit = 1;
card1.value = 1;
card_t *c_ptr = &card1;
card_t **c_pptr = &c_ptr;
card_t card2;
card2.suit = 2;
card2.value = 2;
card_t *c_ptr2 = &card2;
card_t **c_pptr2 = &c_ptr2;
card_t card3;
card3.suit = 0;
card3.value = 5;
card_t *c_ptr3 = &card3;
card_t **c_pptr3 = &c_ptr3;
card_t card4;
card4.suit = 2;
card4.value = 2;
card_t *c_ptr4 = &card4;
card_t **c_pptr4 = &c_ptr4;
deck.cards = c_pptr;
deck.n_cards = 4;
deck_t *d_ptr = &deck;
shuffle(d_ptr);
}
【问题讨论】:
-
您只将一张卡片放入
deck.cards,而不是全部四张卡片。 -
deck.cards = c_pptr;牌组中只有一张牌。为什么需要双*指针? -
旁白:在使用
enum定义套装后,您忽略它并使用0、1等。 -
@WeatherVane 这是一个课程作业,我应该使用指向指针的指针来执行此操作,那么如何像数组一样将这些指针添加到第一张卡片之后的牌组?
-
您可能需要
card_t struct的数组并将deck_t struct中的数组地址存储在单指针而不是双指针中。
标签: c pointers struct segmentation-fault shuffle