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

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

不管出于什么原因,我都不明白为什么我会遇到细分错误。 我已经创建了一个类型为“Card”的数组,它应该可以容纳5张卡。然后在make hand中,我想为该阵列中的每张卡添加一套衣服和一张脸

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

请帮忙!! 多谢各位

以下是我创建用户“手”的代码 这就是分段错误发生的地方

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