c++ - 创建结构数组时遇到分段错误
问题描述
无论出于何种原因,我都无法弄清楚为什么会遇到分段错误。我创建了一个“卡片”类型的数组,应该可以容纳 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[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
的数组的指针(数组)。然后你像这样调用这个函数:Card
cardArray
makeHand(甲板,cardArray);
deck 是正确的类型,它是 type 的指针Card
。但是,cardArray
它只是一个数组,而不是指向数组的指针。我不确定您要实现的功能,但将 makeHand 更改为:
void makeHand(Card* deck, Card* cardArray) {}
应该适合您的需求。
澄清:指针与数组并不完全相同,我只是认为这是理解两者之间差异的有用比较。
Card* deck;
和
Card deck[];
会在记忆中做同样的事情
推荐阅读
- javascript - 添加事件处理程序并立即调用一次
- python - 访问没有端口 8080 的私有 Google 驱动器文档
- bash - Bash 使用 cut 分隔 IP 和端口
- django - 可以为某些 url 设置 ALLOWED_HOSTS 不同的配置吗?
- java - 可以从 Flux 设置 Content-Disposition 标头
在多部分请求中? - javascript - 如何处理可能的未处理的 Promise Rejection (id:0)
- ansible - 在 Ansible 中检查字典中键的值
- pandas - python + pandas中这段代码的错误是什么
- git - 在 Azure 中创建 Git 分支,如何在 Visual Studio 中连接或签出
- python-3.x - 如何通过用户输入打开文件?