C++ 创建结构数组时遇到分段错误
不管出于什么原因,我都不明白为什么我会遇到细分错误。 我已经创建了一个类型为“Card”的数组,它应该可以容纳5张卡。然后在make hand中,我想为该阵列中的每张卡添加一套衣服和一张脸 我认为问题要么发生在数据类型上(常量或非常量??) 有东西通过数组并在新函数中访问它 或 正确分配内存 请帮忙!! 多谢各位 以下是我创建用户“手”的代码 这就是分段错误发生的地方C++ 创建结构数组时遇到分段错误,c++,c,syntax,segmentation-fault,C++,C,Syntax,Segmentation Fault,不管出于什么原因,我都不明白为什么我会遇到细分错误。 我已经创建了一个类型为“Card”的数组,它应该可以容纳5张卡。然后在make hand中,我想为该阵列中的每张卡添加一套衣服和一张脸 我认为问题要么发生在数据类型上(常量或非常量??) 有东西通过数组并在新函数中访问它 或 正确分配内存 请帮忙!! 多谢各位 以下是我创建用户“手”的代码 这就是分段错误发生的地方 // Make the user's hand here void makeHand(const Card * deck, Ca
// 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);
}
}
一般定义:
#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;
及
将在内存中执行相同的操作正确的代码:
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);
}
}
void makeHand(常量卡*卡片组,卡片*卡片阵列){
//环行甲板
对于(尺寸i=0;i<5;++i){
printf(“%5s of%-8s%s”,甲板[i]。脸,甲板[i]。西装,
(i+1)%4?”:“\n”);
cardArray[i].face=malloc(sizeof(char)*25);
strcpy(cardArray[i].面,deck[i].面);
cardArray[i].suit=malloc(sizeof(char)*25);
strcpy(卡片阵列[i]。套装,套装[i]。套装);
}
}
您可能想使用
cardArray[5]代码>在main
中定义?现在,您使用数组,将其元素用作指针(它们没有指向任何有效的位置),并尝试在那里找到卡片结构(并写入不存在的“faces”和“Suites”。makeHand(Card*,Card*array[])
有两种不同的参数类型,但传递相同的类型(一个卡片数组)在这两种情况下,都有一个是错误的!您是否对所有这些c字符串、指针、数组和malloc调用都感兴趣(也许这是学校作业?)我们可以把你转换成“代码> STD::/CUT>”,它的代码> STD::String < /C> >,代码> STD::向量< /代码>,不需要手动管理内存吗?这个C++代码> MalOC/<代码>在C++程序中做什么?C++中有<代码> STD::String < /C>。;
。如果没有,请调整您的编译器设置,因为它会导致您浪费大量时间试图运行错误的程序。完全忘记数组的名称也是指向该数组的指针。这就解决了它。谢谢!!@MackBodie不太清楚。它位于参数列表中,因为您只能通过引用传递数组,而只能在常规数组中传递数组不是指针,而是可以衰减为指针。这是一个很小的区别,直到它起作用为止,如果你弄错了,它会把程序搞得一团糟。没错,用我的类比作为一种一般的思维方式,而不是严格的规则。指针!=数组,但Card*deck;
和Card deck[]在内存中,同样的事情也会发生。@ McBOBODY介意回答一个答案。第一段的解释和解释完全错误,但是代码建议是好的,代码>卡片甲板[];在代码C或标准C++中,甚至不允许,一开始(在块或文件范围内)。。此外,在函数参数列表中,长度被忽略,它是一个指针而不是数组。*25
是可疑的,要声称代码是“正确的”,我认为最好做点什么来验证您没有造成缓冲区溢出。malloc()通常都使用MAX_LEN常量
和const char face[FACES][MAX_LEN]={“Ace”…
因此,即使您忘记并指定了一个外来名称,如“Паааааааааааааааааааааа1072(不过,我不想过分偏离原始代码而使理解复杂化)。
Card* deck;
Card deck[];
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);
}
}