2017-10-27 2 views
0

私の構造体のフィールドである文字列配列に値を代入する際に問題があります。この場合、この構造体の配列も使用しています。 forループなしで値を割り当てると、すべて正常に動作します。しかし、問題はforループで発生します。私はすべての課題を印刷しており、問題はありません。しかし問題は実際には、すべての代入が実際にはそのフィールドのすべての構造体のすべての配列位置を書き換えるということです。forループは構造体Cの配列のすべての値を書き換えます

struct ship 
{ 
int length; 
char *fields[4]; 
}; 

struct ship shipPositions[6]; 

for(int h=0; h < length; h++) //goes from 0 to 3 for first two values 
     { 

      char c = getCharFromInt(begin + h); //my function which works fine; begin = 2; 
      char coord[3] = "$"; 
      append(coord, c); // also works fine 
      append(coord,ships[i][1]); 
      shipPositions[i].fields[h] = coord; 
      printf("shipPositions[%d].fields[%d] = %s\n", i,h,shipPositions[i].fields[h]); 


     } 

printf("Position: %s\n",shipPositions[0].fields[0]); 
printf("Position: %s\n",shipPositions[0].fields[1]); 

/* it prints assignments and then on the first two values after for loop 
shipPositions[0].fields[0] = $C2 
shipPositions[0].fields[1] = $D2 
shipPositions[0].fields[2] = $E2 
shipPositions[1].fields[0] = $F0 
shipPositions[1].fields[1] = $G0 
shipPositions[1].fields[2] = $H0 
shipPositions[5].fields[0] = $H8 
shipPositions[5].fields[1] = $I8 
Position: $I8 
Position: $I8 
*/ 

そして私はforループの最初の2例をシミュレートする際に、すべてのものも結構です:

char c1 = getCharFromInt(2 + 0); 
char coord1[3] = "$"; 
append(coord1, c1); 
append(coord1,ships[0][1]); 
shipPositions[0].fields[0] = coord1; 
printf("shipPositions[%d].fields[%d] = %s\n", 0,0,shipPositions[0].fields[0]); 

char c2 = getCharFromInt(2 + 1); 
char coord2[3] = "$"; 
append(coord2, c2); 
append(coord2,ships[0][1]); 
shipPositions[0].fields[1] = coord2; 
printf("shipPositions[%d].fields[%d] = %s\n", 0,1,shipPositions[0].fields[1]); 

printf("Position: %s\n",shipPositions[0].fields[0]); 
printf("Position: %s\n",shipPositions[0].fields[1]); 

/* 
shipPositions[0].fields[0] = $C2 
shipPositions[0].fields[1] = $D2 
Position: $C2 
Position: $D2 


*/ 
+2

これは、ブロック*の終わりに*死んでいる*変数へのポインタがあるからです。また、そのようなフィールドの場合は* strings *ではなく、代わりに 'struct Position {int x、y; } 'は言う。 –

+0

お返事ありがとうございました。このループを修正する方法を教えてください。前もって感謝します。 –

+0

[関連](https://stackoverflow.com/q/46969661/2371524) –

答えて

0

あなたのコードと2つの問題があります。

最初にchar coord[3]を宣言すると、文字列を終了するためにNUL文字を含める必要があるため、2文字分の文字列を作成しています。しかし、あなたはそれに3文字を格納しているので、それをchar coord[4]と宣言する必要があります。

あなたはappendのためのコードを提供していませんが、あなたはそれをやっていない場合は、coord[3]='\0'

は、第二に、coordだけそれぞれの変数として存在するIE用NUL文字を割り当てるために覚えておく必要がありますかループの繰り返しですが、それが占めるメモリはまだ残ります。 coordshipPositions[i].fields[h]に割り当てると、文字列の実際の内容ではなく、メモリへのポインタが割り当てられます。ループの繰り返しが終了すると、coordが存在しなくなり、コードでは、他のもの(次の例のcoordなど)が占有していたメモリを、shipPositions[i].fields[h]にある値を上書きして使用することができます。

あなたはchar fields[4][4]のような配列の配列とあなたがcoordの内容を隠したいときにあなたがstrcpyすなわちstrcpy(shipPositions[i].fields[h],coord)を使用することfieldsを宣言する必要があります。そうすれば、値を格納しているメモリを "所有"し、一度上書きされることはありませんcoordはもう存在しません。

+0

クリスおかげさまで、ありがとう! –

関連する問題