创建结构的数组时遇到分段错误



无论出于什么原因,我都不明白为什么会遇到分段错误。我已经创建了一个"卡片"类型的数组,应该可以容纳5张卡片。然后在制作手牌时,我想为该阵列中的每一张牌添加一套和一张脸。

我认为问题要么发生在数据类型上(常量还是非常量??(有东西通过数组并在新函数中访问它或正确分配内存。

请帮忙!!非常感谢。

这是我创建用户"手"的代码这就是发生分段故障的地方

// Make the user's hand here
void makeHand(const Card * deck, Card * cardArray[5]){
// loop through Deck
for (size_t i = 0; i < 5; ++i) {
printf("%5s of %-8s%s", deck[i].face, deck[i].suit,
(i + 1) % 4 ? "  " : "n");
cardArray[i]->face = malloc(sizeof(char) * 25);
strcpy(cardArray[i]->face, deck[i].face);
cardArray[i]->suit = malloc(sizeof(char) * 25);
strcpy(cardArray[i]->suit, deck[i].suit);
}
}

这是我的主要功能:

int main(void){
Card deck[CARDS]; // define array of Cards
// initialize array of pointers
const char *face[] = { "Ace", "Two", "Three", "Four", "Five",
"Six", "Seven", "Eight", "Nine", "Ten",
"Jack", "Queen", "King"};
// initialize array of pointers
const char *suit[] = { "Hearts", "Diamonds", "Clubs", "Spades"};
srand(time(NULL)); // randomize
fillDeck(deck, face, suit); // load the deck with Cards
shuffle(deck); // put Cards in random order
deal(deck); // deal all 52 Cards
// Make an array that holds 5 cards, initialize to 0
Card cardArray[5];
makeHand(deck, cardArray);
//twoPair(cardArray);
} 

一般定义:

#define CARDS 52
#define FACES 13
// card structure definition                  
struct card {                                 
const char *face; // define pointer face
const char *suit; // define pointer suit
}; 
typedef struct card Card; // new type name for struct card   
// prototypes
void fillDeck(Card * wDeck, const char * wFace[],
const char * wSuit[]);
void shuffle(Card * wDeck);
void deal(const Card * wDeck);
// Make a 5 card hand and return it
// should return an array of 5 cards
void makeHand(const Card * deck, Card * cardArray[5]);
// Definitions to check for each condition
void twoPair(Card *cardArray[5]);

正确代码:

void makeHand(const Card * deck, Card *cardArray){
// loop through Deck
for (size_t i = 0; i < 5; ++i) {
printf("%5s of %-8s%s", deck[i].face, deck[i].suit,
(i + 1) % 4 ? "  " : "n");
cardArray[i].face = malloc(sizeof(char) * 25);
strcpy(cardArray[i].face, deck[i].face);
cardArray[i].suit = malloc(sizeof(char) * 25);
strcpy(cardArray[i].suit, deck[i].suit);
}
}

您可能想要使用main中定义的cardArray[5];?现在,你取数组,使用它的元素作为指针(它们没有指向任何有效的地方(,并尝试在那里找到Card结构(并写入不存在的"面"one_answers"套装"。

我认为问题在于您对指针的理解。

从本质上讲,用*标记一个变量并用[]使其成为"数组"可以做非常非常相似的事情。它们都构成一个指针,但使用[]运算符,您将向系统指定数组的长度。变量保存内存中某个点的内存地址,数组在取消引用它之前,保存内存中一个点的存储器地址。您的功能:

void makeHand(const Card * deck, Card * cardArray[5]){
// loop through Deck
for (size_t i = 0; i < 5; ++i) {
printf("%5s of %-8s%s", deck[i].face, deck[i].suit,
(i + 1) % 4 ? "  " : "n");
cardArray[i]->face = malloc(sizeof(char) * 25);
strcpy(cardArray[i]->face, deck[i].face);
cardArray[i]->suit = malloc(sizeof(char) * 25);
strcpy(cardArray[i]->suit, deck[i].suit);
}
}

此函数接收一个称为deckCard类型的指针(数组(,以及一个名为cardArrayCard类型的数组的指针(阵列(。然后你调用这个函数,比如:

makeHand(牌组,cardArray(;

deck是正确的类型,它是类型为Card的指针。然而,cardArray只是一个数组,而不是指向数组的指针。我不确定你想要实现的功能,但把makeHand改成

void makeHand(Card* deck, Card* cardArray) {}

应该适合你的需要。

澄清:指针和数组不是一回事,我只是认为它是理解两者区别的有用比较。

Card* deck;

Card deck[];

将在内存中执行相同的操作

相关内容

  • 没有找到相关文章

最新更新