首页 > 解决方案 > 创建结构数组时遇到分段错误

问题描述

无论出于何种原因,我都无法弄清楚为什么会遇到分段错误。我创建了一个“卡片”类型的数组,应该可以容纳 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]);

标签: c++csyntaxsegmentation-fault

解决方案


我相信你的问题在于你对指针的理解。

本质上,用标记变量*并使其成为“数组”[]会做非常相似的事情。他们都创建了一个指针,但是使用[]运算符,您正在向系统指定数组的长度。变量保存内存中某个点的内存地址,而数组在取消引用之前保存内存中某个点的内存地址。你的功能:

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);
    }
}

该函数接收一个类型Card为的指针(数组)和一个类型为deck的数组的指针(数组)。然后你像这样调用这个函数:CardcardArray

makeHand(甲板,cardArray);

deck 是正确的类型,它是 type 的指针Card。但是,cardArray它只是一个数组,而不是指向数组的指针。我不确定您要实现的功能,但将 makeHand 更改为:

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

应该适合您的需求。

澄清:指针与数组并不完全相同,我只是认为这是理解两者之间差异的有用比较。

Card* deck;

Card deck[];

会在记忆中做同样的事情


推荐阅读