从函数返回后指针为 NULL

Pointers are NULL after returning from a function

我是 C 编程的初学者。当函数returns转到main()时,两个int指针returnNULL,但在函数中它们指向了正确的值。你有什么建议吗?

int main(){
    int k_attivi=0, n=0, in_game = 0, i, k=0;
    int *array_indici = NULL, *array_ingame = NULL;
    Player *players = NULL;    

    players = upload_players(&k, &in_game, &n, &k_attivi, array_indici, array_ingame);
            
    return 0;
}

Player *upload_players(int *k, int *in_game, int *n_tot, int *k_attivi, int* array_indici,  int* array_in_game){
    FILE *partita = NULL;
    Player *players=NULL;

    partita = fopen("file.bin", "rb");

    if(partita==NULL)
        exit (-1);

    fread(k, sizeof(int ), 1, partita);
    players = calloc(*k, sizeof(Player));
    fread(players, sizeof (Player), *k, partita);
    fread(in_game, sizeof(int ), 1, partita);
    if(*in_game == 1){
       fread(n_tot, sizeof(int), 1, partita);
       fread(k_attivi, sizeof(int), 1, partita);
       array_indici = calloc(*k_attivi, sizeof(int));
       fread(array_indici, sizeof(int), *k_attivi, partita);
       array_in_game = calloc(*k, sizeof(int));
       fread(array_in_game, sizeof(int), *k, partita);
    }
    fclose(partita);
    return players;
}

指针按值传递给函数。这意味着该函数处理传递的指针值的副本。副本的变化不影响用作参数表达式的原始指针。

您需要通过指向它们的指针按引用传递它们。

例如

Player *upload_players(int *k, int *in_game, int *n_tot, int *k_attivi, 
                       int** array_indici,  int* array_in_game);

并像

那样调用函数
players = upload_players(&k, &in_game, &n, &k_attivi, &array_indici, &array_ingame);

在函数中,您需要取消引用指针以直接访问原始指针,例如

*array_indici = calloc(*k_attivi, sizeof(int));

为了清楚地比较传递给你的指针,例如在 main 中声明的变量 k。变量 k 通过指向它的指针按引用传递。因此,通过取消引用指向它的指针来更改函数内的变量将反映在 main 中的原始变量 k 上。与您需要通过指向函数的指针将指针传递给函数的方式相同。