尝试在C中复制结构时出现问题

时间:2020-04-20 16:54:27

标签: c struct copy

所以我开始使用C,并且内存分配几乎总是存在一些问题。基本上,当我尝试将一个结构复制到另一个结构时,我会卡住。

我将把代码放在这里: 头文件是:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

//declaration constants
#define MAX_NAME 15+1
#define SEATS_PERCENTAGE 0.95
#define IN_TIME 60
#define OUT_TIME 120

//type declarations
typedef enum {FORBIDDEN, ALLOWED_WITH_COMPANION, ALLOWED} tFairgroundRideAccess;

typedef struct{
    tFairgroundRideAccess lessThan100;
    tFairgroundRideAccess between100_120;
    tFairgroundRideAccess between120_140;
    tFairgroundRideAccess greaterThan140;
} tFairgroundRideHeightRequirement;

typedef struct {
    char name[MAX_NAME];
    tFairgroundRideHeightRequirement accessHeight;
    int durationTrip;
    int numPersonsTrip;
    int peopleInQueue;
} tFairgroundRide;

tFairgroundRide myFairgroundRide;

//define function headers
void readFairgroundRide(tFairgroundRide *fRide);
void writeFairgroundRide(tFairgroundRide fRide);
void copyFairgroundRide(tFairgroundRide fRideSrc, tFairgroundRide *fRideDst);
int waitingTime (tFairgroundRide fRide, int people);
bool accessWithoutCompanion (tFairgroundRide fRide, int height);
void selectFairgroundRide (tFairgroundRide fRide1, tFairgroundRide fRide2, int people1, int people2, int height2);

具有该功能的文件为以下文件(我要检查为什么我在函数copyFairgroundRide中未正确分配新副本的原因):

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include "fairgroundRide.h"

void readFairgroundRide(tFairgroundRide *fRide){
    printf("NAME >> \n");
    scanf("%s", fRide->name);
    getchar();
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED) >> \n");
    scanf("%d", &fRide->accessHeight.lessThan100);
    getchar();
    printf("ACCESS HEIGHT, BETWEEN100_120 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED) >> \n");
    scanf("%d", &fRide->accessHeight.between100_120);
    getchar();
    printf("ACCESS HEIGHT, BETWEEN120_140 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED) >> \n");
    scanf("%d", &fRide->accessHeight.between120_140);
    getchar();
    printf("ACCESS HEIGHT, GREATERTHAN140 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED) >> \n");
    scanf("%d", &fRide->accessHeight.greaterThan140);
    getchar();
    printf("TRIP DURATION >> \n");
    scanf("%d", &fRide->durationTrip);
    getchar();
    printf("NUMBER OF PERSONS ON A TRIP >> \n");
    scanf("%d", &fRide->numPersonsTrip);
    getchar();
}

void writeFairgroundRide(tFairgroundRide fRide){
    printf("NAME: %s\n", fRide.name);
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED): %d\n",fRide.accessHeight.lessThan100);
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED): %d\n",fRide.accessHeight.between100_120);
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED): %d\n",fRide.accessHeight.between120_140);
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED): %d\n",fRide.accessHeight.greaterThan140);
    printf("TRIP DURATION: %d\n", fRide.durationTrip);
    printf("NUMBER OF PERSONS ON A TRIP: %d\n", fRide.numPersonsTrip);
}

void copyFairgroundRide(tFairgroundRide fRideSrc, tFairgroundRide *fRideDst){
    strcpy(fRideDst->name,fRideSrc.name);
    fRideDst->accessHeight.lessThan100 = fRideSrc.accessHeight.lessThan100;
    fRideDst->accessHeight.between100_120 = fRideSrc.accessHeight.between100_120;
    fRideDst->accessHeight.between120_140 = fRideSrc.accessHeight.between120_140;
    fRideDst->accessHeight.greaterThan140 = fRideSrc.accessHeight.greaterThan140;
    fRideDst->durationTrip = fRideSrc.durationTrip;
    fRideDst->numPersonsTrip = fRideSrc.numPersonsTrip;
    fRideDst->peopleInQueue = fRideSrc.peopleInQueue;
}

int waitingTime (tFairgroundRide fRide, int people){
    int result;
    result = ((IN_TIME+OUT_TIME+(fRide.durationTrip*60)) * (fRide.numPersonsTrip * SEATS_PERCENTAGE) * people);
    return result;
}

bool accessWithoutCompanion (tFairgroundRide fRide, int height){
    if (height < 100 && fRide.accessHeight.lessThan100 == 2){
        return true;
    }
    if(height >= 100 && height<120 && fRide.accessHeight.between100_120 == 2){
        return true;
    }
    if(height >= 120 && height<=140 && fRide.accessHeight.between120_140 == 2){
        return true;
    }
    if (height > 140 && fRide.accessHeight.greaterThan140 == 2){
        return true;
    }else{
            return false;
    }
}


void selectFairgroundRide (tFairgroundRide fRide1, tFairgroundRide fRide2, int people1, int people2, int height2){
    if((accessWithoutCompanion(fRide1,height2) == true) && (waitingTime(fRide1,people1)<=waitingTime(fRide2,people2))){
        copyFairgroundRide(fRide1,&myFairgroundRide);
    }
    if((accessWithoutCompanion(fRide1,height2) == true) && (accessWithoutCompanion(fRide2,height2)==false)){
        copyFairgroundRide(fRide1,&myFairgroundRide);
    }
    if((accessWithoutCompanion(fRide1,height2) == false) && (accessWithoutCompanion(fRide2,height2))){
        copyFairgroundRide(fRide2,&myFairgroundRide);
    }
}

主要代码是:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include "fairgroundRide.h"

int main(){

    tFairgroundRide myFairgroundRide;
    tFairgroundRide fairgroundRide1;
    tFairgroundRide fairgroundRide2;
    int height1,people1,people2;

    printf("ENTER DATA FOR FIRST FAIRGROUND RIDE >>\n");
    readFairgroundRide(&fairgroundRide1);
    printf("ENTER THE PEOPLE IN THE QUEUE OF FAIRGROUND RIDE 1 >> \n");
    scanf("%d", &people1);
    getchar();
    printf("ENTER DATA FOR SECOND FAIRGROUND RIDE >>\n");
    readFairgroundRide(&fairgroundRide2);
    printf("ENTER THE PEOPLE IN THE QUEUE OF FAIRGROUND RIDE 2 >> \n");
    scanf("%d", &people2);
    getchar();
    printf("ENTER THE HEIGHT >> \n");
    scanf("%d", &height1);
    getchar();
    selectFairgroundRide(fairgroundRide1,fairgroundRide2,people1,people2,height1);
    printf("RESULTS:\n");
    writeFairgroundRide(myFairgroundRide);
    getchar();
    return 0;
}

因此,当我运行程序时,我可以同时获取两个输入的所有信息faigroundRide1和fairgroundRide2,但是如果将其复制到另一个名为myFairgroundRide的结构中,我会开始得到奇怪的字符和数字,并且我知道这是由于内存分配,但我找不到问题所在或原因。如果您需要有关代码的进一步说明或我有什么疑问,请告诉我,我将尝试以另一种方式重做。

预先感谢, 豪尔赫。

1 个答案:

答案 0 :(得分:1)

您有两个myFairgroundRide。一个在全局范围内,一个在main中作为局部变量。在selectFairgroundRide中,您将复制到全局副本中的一个。

顺便说一下,main可以简化:

copyFairgroundRide