将一个结构指向另一个结构? (不是永久性的)

时间:2014-09-25 22:08:01

标签: c struct

我努力让一个结构指向另一个依赖于传递到命令行的参数的结构,问题是,结构我似乎正确指向初始化游戏中的所需结构函数,(由在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);

}

2 个答案:

答案 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中的值传递的,如果修改函数中的指针参数,则只修改指针的副本。