2015-09-28 59 views
0

我在C中遇到了一个奇怪的问题,我正在使用一个结构体。其中一个结构元素是一个大小为3的char数组的数组。该元素意味着是玩家的手,并且char数组意味着成为单个卡。他们格式化为“2C”,其中2是排名,C是俱乐部。我的问题在于从给定的字符串创建玩家手的功能。在循环中,j是卡片索引,最后它将创建的卡片(我知道是正确的)分配给索引。在循环的最后一次迭代中,它分配了4C,并且由于某种原因,每个元素都变为4C。这里是该功能的代码:为Struct中的指针指向char指针将覆盖所有值?

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。有人能告诉我这里发生了什么事吗?

+0

没有主要功能包括 – amdixon

+0

的代码是真实相关的功能代码,我测试的存储器的分配的手所以不包括在内。 –

+3

因为我们没有办法复制或测试你的代码 – amdixon

回答

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]); 

所有的数组元素被设置由环路指向tmpa[1]然后被覆盖指向dummy。的tmpdummy的最终值分别为2042,所以输出是

20 42 20 20 
+0

好吧,但是当数据 - > playerHand [5] =“7C”时,怎么会发生进程,并不是所有的值都变成了“7C”? –

+0

@JessAhrens因为你只是分配给'data-> playerHand [5]'? – melpomene

+0

是的,但它不是在for循环的上下文中与'data-> playerHand [j] = tempChar'相同,因为j从0增加到handsize,每次迭代都会增加索引不是吗? –