Aanwijzer toewijzing met behulp van malloc gaat fout

Gelieve te voelen vrij om te kopiëren en uit te proberen, het stopt met werken halverwege de functie handget wanneer de individuele hand een spatie in het geheugen krijgt toegewezen

/* 
 * A program that is meant to classify five-card poker hands. 
 *Is still in progress
 */

#include
#include
#include
#include
#include
#include

#define SEED 7
#define SIZE 5

/*
 *
 */

typedef enum suits {
   clubs,
   diamonds,
   hearts,
   spades
} suits;

typedef enum values {
    zero,
    one,//not used, but ensures numerical values correspond
    two,
    three,
    four,
    five,
    six,
    seven,
    eight,
    nine,
    ten,
    jack,
    queen,
    king,
    ace
} values; 

typedef struct cards {
    suits suit;
    values value;
} cards;

int islegal(cards *hand, int nr_of_cards);
/* Given any number of cards, determines whether any duplicates
 * or false cards are present or not. If so, returns 0, otherwise 1. 
 */
int flop(cards **handPtr); 
/* Asks the user to input a hand of cards; 
 * returns the number of cards being input
 */
int *rawtoflop (cards *handPtr, int nr_of_cards);

int hander(cards **handPtr,int counter); 

int handget(cards **playerhands,cards *thishands, int handsize);

void printsuit(suits thissuit);
/* Prints the enum-type suits
 */

void printvalue(values thisvalue);
/* Prints the enum-type values
 */

void printhand(cards *hand, int nr_of_cards); 
/* Prints a hand of cards without further processing 
*/
int main(void) {
    cards *thishand, *playerhands;

    flop(&thishand);
    printhand(thishand,6);
    handget(&playerhands,thishand,6);

    return 0;
}

int islegal(cards *hand, int nr_of_cards) {
    int i, fulldeck[4][13]={0};
    int current_value, current_suit;
    cards *current_card = hand;
    int legal = 1; 

    for (i=0; i 0 ) {
            legal = 0;
            break;
        } else {
            fulldeck[current_suit][current_value - 2]++;
        }
        current_card++;
    }

    return legal;
}

int flop(cards **handPtr) {
    int i,*q=NULL,n=NULL;
    int j[5]={0,0,0,0,0};
    int k[5]={1,1,1,1,1},nr_of_cards = 5;//for more/less cards CHANGE HERE!
    char rawsuit, rawcard[4];

   //allocate the required amount of memory for your cards
    (*handPtr) = (cards *) malloc(nr_of_cards * sizeof(cards));

    n=memcmp(j,k,sizeof(j));
    while(n!=0) {
        printf("Please input the five cards on the table: ");
        q=rawtoflop(*handPtr,nr_of_cards);
        for (i=0;i
0
Wat is de vraag? Denk je echt dat we je hele code gaan lezen en proberen te raden wat de vraag is? Geef meer details, verwachting, compileruitvoer, enz ...
toegevoegd de auteur Macmade, de bron
Herschrijf uw code volledig.
toegevoegd de auteur FailedDev, de bron
Verwijder alle casts vóór malloc (3) -aanroepen. Die afgietsels waren niet nodig sinds 1989 toen prototypes aan de taal werden toegevoegd. Het hebben van de casts in het programma kan ernstige fouten verbergen. is al # include d, dus alles wat u hoeft te doen is de casts verwijderen.
toegevoegd de auteur sarnold, de bron
toegevoegd de auteur Bart, de bron
Controleer uw compilerwaarschuwingen, er zijn nogal wat ...
toegevoegd de auteur AusCBloke, de bron
heb je geprobeerd om een ​​debug-tool zoals gdb te gebruiken?
toegevoegd de auteur mtahmed, de bron
@Macmade excuses voor de slechte vraag, mijn andere probleem was niet opgelost dus ik probeerde de vraag te herschrijven en de code te verdichten en een paar van de variabelen te verwijderen om het er schoner te laten lijken (volgens het advies van iemand over mijn andere probleem.
toegevoegd de auteur user1083734, de bron

2 antwoord

U wijst voldoende ruimte toe voor 7 kaarten:

(*playerhand) = (cards *) malloc(7*sizeof(cards));

Vervolgens kopieer je zeven kaarten naar * playerhand + 5 :

memcpy(*playerhand+5,player,7*sizeof(cards));

So you get a buffer overflow. *playerhand+5 is the same as &(*playerhand)[5]. So you're copying 7 cards into the fifth place in an array with enough capacity for 7 cards.

Dat is een probleem met het gebruik van het magische getal. Ik kan niet raden wat deze "5" betekent als je hem geen naam geeft (noch waarom 7 kaarten).

1
toegevoegd
excuses voor de slechte vraag, mijn andere probleem was niet opgelost dus ik probeerde de vraag te herschrijven en de code te verdampen en een paar van de variabelen te verwijderen om het er schoner te laten lijken (volgens het advies van iemand over mijn andere probleem.
toegevoegd de auteur user1083734, de bron

Actually the problem is not that you're copying TO thishands but that you are copying FROM thishands. You allocated 5*sizeof(cards) to thishands,but when calling handget, you're calling it with handget(&playerhands,thishand,6);. The last argument is 6, and therein lies your problem.

Ontdoe je van al deze magische nummers. Maak ze in plaats daarvan (en dit is strikt omdat je C niet C ++ lijkt te gebruiken) #defines. Op die manier heb je een consistent nummer om mee te werken.

1
toegevoegd