【问题标题】:Problem when trying to copy a struct in C尝试在 C 中复制结构时出现问题
【发布时间】:2020-04-20 16:54:27
【问题描述】:

所以我开始使用 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 的结构中,我会开始收到奇怪的字符和数字,我知道这是由于内存造成的分配,但我找不到问题的原因或位置。如果您需要有关代码的进一步解释或我有什么疑问,请告诉我,我会尝试以另一种方式重做。

提前致谢, 豪尔赫。

【问题讨论】:

  • writeFairgroundRide(myFairgroundRide); 但myFairgroundRide 未初始化。
  • 你好像忘了给copyFairgroundRide()打电话
  • 另外,在selectFairgroundRide 中,myFairgroundRide 不可见!因此您无法复制到此变量。 (正如 HAL9000 发现的,有两个变量声明。)
  • 我在函数 selectFairgroundRide() 中调用函数 copyFairgroundRide,我在其中设置了一些条件,根据这些条件是否匹配,我将 fairgroundRide1 或 fairgroundRide2 复制到 myFairgroundRide。如果没有很好地声明,我应该在哪里声明或调用这个函数?提前致谢!
  • @PaulOgilvie, selectFairgroundRide 不会修改其参数,因此指针不是绝对必要的。虽然当结构很大时这是一个很好的做法。

标签: c struct copy


【解决方案1】:

您有两个myFairgroundRide。一个在全局范围内,一个在main 中作为局部变量。在selectFairgroundRide 中复制到全局的,但稍后在main 中打印本地的。

顺便说一句,copyFairgroundRide 可以简化:

void copyFairgroundRide(tFairgroundRide fRideSrc, tFairgroundRide *fRideDst)
{
   *fRideDst = fRideSrc;
}

【讨论】:

  • 感谢您的回答!所以基本上我需要将我的局部变量转换为全局变量对吗?这样做的方法不是在 main 中声明它吗?谢谢!
  • 您可能想要做的是将fairgroundRide1 和fairgroundRide1 作为指向selectFairgroundRide 的指针传递,然后只返回其中一个指针。
  • 好的,感谢您的快速回复!所以现在如果我删除全局变量并且只将一个留在 main 方法中。当我在 selectFairgroundRide 中使用 myFairgroundRide 时,会告诉我 myFairgroundRide 未声明,即使在 main 方法的开头声明也是如此。编辑:我需要使用 copymethod,这就是我从 fairgrondRide1 或 2 复制到 selectFairgroundRide 的原因,我该怎么做才能将其中一个指针返回到变量 myFairgroundRide ?
  • selectFairgroundRide 不知道main 中的任何局部变量,因此如果selectFairgroundRide 应该修改它,则必须将指向myFairgroundRide 的指针作为参数传递。您也可以将fRide1 或fRide2 作为返回值返回,并将其分配给main 中的myFairgroundRide。但正如我在之前的评论中所说,使用指针可能会更好。
  • 你是山羊!非常感谢! @HAL9000
猜你喜欢
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多