2014-09-25 57 views
0

我正在努力让一个结构指向另一个依赖于传入命令行的参数,问题是,结构我看起来正在指向所需的初始化结构但是,当我在函数调用后打印它们的地址时,在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); 

} 

回答

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); 
+0

谢谢你提供了一个明确的答案,我现在明白了这项工作是如何的(对不起,我的头脑有些棘手) – user3603183 2014-09-25 22:50:25

+0

通过价值传递指针并尝试修改它们是棘手的 - 它捕捉到许多新的C程序员未料到。我链接到的Stackoverflow问题可以帮助你非常。但是如果你想修改一个函数中的指针,你需要传递它的地址,然后在函数中去引用来完成赋值 – 2014-09-25 22:54:08

0

您需要使用指向函数参数结构的指针(例如,Player **x)。使用指向结构的指针只能修改结构对象,而不能修改指针对象。记住所有的函数参数都是通过C中的值传递的,如果你修改函数中的指针参数,你只是修改指针的一个副本。

+0

哪些功能会我需要那些参数?我刚刚尝试了它自己的parse_args,它自己的initialise_game,并且两者在一起,但他们似乎并没有工作...... – user3603183 2014-09-25 22:33:09

+0

@ user3603183所有这些,但你必须正确地将参数传递给函数并正确解引用函数中的指针。在你的编译器中启用警告,如果有的话修复它们。 – ouah 2014-09-25 22:35:34

相关问题