索引指向Struct中的char指针的指针会覆盖所有值吗?

时间:2015-09-28 04:29:12

标签: c struct

我在C中遇到一个奇怪的问题我正在使用一个结构。其中一个结构元素是一个大小为3的char数组。该元素是一个玩家手,而char数组则是单独的卡。它们的格式类似于“2C”,其中2是排名,C是俱乐部。我的问题在于一个从给定字符串创建玩家手的功能。在循环中,j意味着是卡索引,并且最后它将创建的卡(我知道是正确的)分配给索引。在循环的最后一次迭代中,它分配4C,并且由于某种原因,每个元素都变为4C。以下是该函数的代码:

typedef struct dataStruct {
int playerCount;
int handSize;
char playerID;
char** playerHand;
} dataStruct;

void proc_new_round(struct dataStruct* data, char* input) {
int length = strlen(input), i = 9, j = 0;
char tempChar[3];
if (length != 86 && length != 59 && length != 47)
    invalid_hub_message();
else if (input[8] != ' ')
    invalid_hub_message();
alloc_hand_size(data, (length - 8) / 3);
for (j = 0; j < data->handSize; j++) {
    if (input[i] != '2' && input[i] != '3' && input[i] != '4' &&
        input[i] != '5' && input[i] != '6' && input[i] != '7' &&
        input[i] != '8' && input[i] != '9' && input[i] != 'T' &&
        input[i] != 'J' && input[i] != 'Q' && input[i] != 'K' &&
        input[i] != 'A' ) {
        invalid_hub_message();
    }
    tempChar[0] = input[i++];
    if (input[i] != 'H' && input[i] != 'D' && input[i] != 'C' &&
        input[i] != 'S' ) {
        invalid_hub_message();
    }
    tempChar[1] = input[i++];
    tempChar[2] = '\0';
    printf("tempchar %s\n", tempChar);
    data->playerHand[j] = tempChar;
    if (i < length) {
        if (input[i++] != ',')
            invalid_hub_message();
    }
    printf("%d\n", j);
}
data->playerHand[5] = "7C";
printf("%s\n", data->playerHand[5]);
printf("%s\n", data->playerHand[12]);
printf("%s\n", data->playerHand[7]);
//print_hand(data);
}

为该功能提供的输入是: newround 2C,2C,2C,2C,2C,2C,2C,2C,2C,2C,2C,2C,4C 在功能结束时,打印的3张牌是7C,4C和4C,但是如果创建了临时卡,它应该是7C,4C和2C。我的打印手功能还打印出除索引5之外的每张卡作为4C。有人能告诉我这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

    data->playerHand[j] = tempChar;

data->playerHand中的所有指针都具有相同的值,并指向同一个数组tempChar。无论最后写入tempChar的内容都是最终值。

您的代码与此类似:

int *a[4];
int tmp;
int j;

for (j = 0; j < 4; j++) {
    tmp = j * 10;
    a[j] = &tmp;
}

int dummy = 42;
a[1] = &dummy;

printf("%d %d %d %d\n", *a[0], *a[1], *a[2], *a[3]);

所有数组元素都设置为循环指向tmp。然后覆盖a[1]以指向dummytmpdummy的最终值分别为2042,因此输出为

20 42 20 20