【问题标题】:Struct values do not hold when passed back to main [duplicate]传回主结构时,结构值不成立[重复]
【发布时间】:2019-06-18 20:33:34
【问题描述】:

首先,我是编码新手,所以如果这里有一个我遗漏的完全明显的问题,我提前道歉。

我正在编写一些代码,将各种名称和数字从文件中读取到如下所示的结构中。

typedef struct KnightsBallLottoPlayer {
    char firstName[20];
    char lastName[20];
    int numbers[6];
} KBLottoPlayer;

我像这样将文件本身的扫描放入它自己的void函数中,在main中使用指针KBLottoPlayer * player;:

void scanning(KBLottoPlayer*players){
    int i, j;

    FILE * ifp = NULL;
    ifp=fopen("KnightsBall.in", "r");

    fscanf(ifp, "%d", &people);
    players = malloc(people * sizeof(KBLottoPlayer));

    for(i=0;i<people;i++){
        fscanf(ifp, "%s%s", &players[i].lastName, &players[i].firstName);

        for(j=0;j<6;j++){
            fscanf(ifp, "%d", &players[i].numbers[j]);
        }
    }
}

到目前为止一切顺利,我在函数中立即打印出所有这些值,它们都排列得很好。没有问题。他们打印准确的值和名称。我返回 main,然后在执行其他任何操作之前再次将它们打印出来,突然间我得到了随机的 ASCII 字符来表示名称和值,比如 -32342342 表示数字。

如果需要,我会粘贴更多信息,但有人知道这是怎么回事吗?我将在这里冒险并假设我应该返回一些东西并改用按值传递函数,但我不完全确定如何从这里开始。提前感谢您的帮助和客气话。

【问题讨论】:

  • 您传递了一个指针的副本。如果你通过 malloc 将该指针指向新的东西,那么你正在修改不同的内存。要么将指针传递给指针,要么在函数外部分配结构。考虑minimal reproducible example,您可能有更多我们看不到的问题。
  • 这不是一个重复的问题。至少,它不是发布的那个的副本。
  • @DarrinCullop:在这个问题中,函数接收一个指针参数players,分配空间,设置指针指向空间,然后返回,丢失指针。在提议的原版中,该函数接收一个指针参数s,分配空间,将指针设置为指向该空间,然后返回,丢失指针。您认为有什么显着差异?
  • 我想这没什么不同。

标签: c function struct


【解决方案1】:

你是按值传递的,你需要按引用传递。如果您通过引用传递指针,它将起作用。试试这个:

void scanning(KBLottoPlayer** players){
    int i, j;

    FILE * ifp = NULL;
    ifp=fopen("KnightsBall.in", "r");

    fscanf(ifp, "%d", &people);
    *players = malloc(people * sizeof(KBLottoPlayer));

    for(i=0;i<people;i++){
        fscanf(ifp, "%s%s", &(*players)[i].lastName, &(*players)[i].firstName);

        for(j=0;j<6;j++){
            fscanf(ifp, "%d", &(*players)[i].numbers[j]);
        }
    }
}

然后当你调用scanning时,传入变量的地址,像这样:

 scanning(&players);

它基本上将一个指针传递给一个指针,以便您可以在其他函数中对其进行修改。

更多信息:

【讨论】:

  • 谢谢!我很感激。这对我有很大帮助。
  • 不客气。欢迎使用 StackOverflow!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2020-10-17
  • 2014-09-08
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多