我努力让一个结构指向另一个依赖于传递到命令行的参数的结构,问题是,结构我似乎正确指向初始化游戏中的所需结构函数,(由在main中调用的parse args调用),但是,当我在函数调用后打印它们的地址时,在main中,如果播放器是A:它似乎没有改变(在输出之后):
Before initialise: 0x7f8a88403990, 0x7f8a884039f0, 0x7f8a88403a50, 0x7f8a88403ab0, 0x7f8a88403b10
After initialise: 0x7f8a884039f0, 0x7f8a884039f0, 0x7f8a88403a50, 0x7f8a88403ab0, 0x7f8a88403b10
After parse args: 0x7f8a88403990, 0x7f8a884039f0, 0x7f8a88403a50, 0x7f8a88403ab0, 0x7f8a88403b10
int main (int argc, char *argv[]) {
Player *me = NULL, *playerA = NULL;
Player *playerB = NULL, *playerC = NULL, *playerD = NULL;
me = malloc(sizeof(*me));
playerA = malloc(sizeof(*playerA));
playerB = malloc(sizeof(*playerB));
playerC = malloc(sizeof(*playerC));
playerD = malloc(sizeof(*playerD));
parse_args(me, playerA, playerB, playerC, playerD, argv);
//should be pointing to the same memory location
printf("After parse args: %p, %p, %p, %p, %p\n", me, playerA, playerB, playerC, playerD);
}
void parse_args(Player *me, Player *a, Player *b, Player *c, Player *d,
char *argv[]) {
initialise_game(*tempChar, tempNum, me, a, b, c, d);
}
void initialise_game(char playerID, int numPlayers, Player *me, Player *a,
Player *b, Player *c, Player *d) {
printf("Before initialise: %p, %p, %p, %p, %p\n", me, a, b, c, d);
switch((int)playerID) {
case 'A':
me = a;
break;
case 'B':
me = b;
break;
case 'C':
if (numPlayers < 3) {
exit_prog(EXIT_PLAYERID);
}
me = c;
break;
case 'D':
if (numPlayers < 4) {
exit_prog(EXIT_PLAYERID);
}
me = d;
break;
}
printf("After initialise: %p, %p, %p, %p, %p\n", me, a, b, c, d);
}
答案 0 :(得分:1)
指针按值传递。这意味着您无法在函数体()中修改它们。请参阅此StackOverflow question/answer
我想你想做点什么:
void parse_args(Player **me, Player *a, Player *b, Player *c, Player *d, char *argv[]) {
initialise_game(*tempChar, tempNum, me, a, b, c, d);
}
void initialise_game(char playerID, int numPlayers, Player **me, Player *a,
Player *b, Player *c, Player *d)
{
printf("Before initialise: %p, %p, %p, %p, %p\n", me, a, b, c, d);
switch((int)playerID) {
case 'A':
*me = a;
break;
case 'B':
*me = b;
break;
case 'C':
if (numPlayers < 3) {
exit_prog(EXIT_PLAYERID);
}
*me = c;
break;
case 'D':
if (numPlayers < 4) {
exit_prog(EXIT_PLAYERID);
}
*me = d;
break;
}
你对parse_args的调用需要为我传递一个指向指针的指针:
parse_args(&me, playerA, playerB, playerC, playerD, argv);
答案 1 :(得分:0)
您需要使用指向函数参数结构的指针(例如Player **x
)。使用指向结构的指针,您只能修改结构对象,而不是指针对象。请记住,所有函数参数都是通过C中的值传递的,如果修改函数中的指针参数,则只修改指针的副本。