从函数返回后指针为 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
上。与您需要通过指向函数的指针将指针传递给函数的方式相同。
我是 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
上。与您需要通过指向函数的指针将指针传递给函数的方式相同。