0

多次元配列 (文字の多次元配列を出力する) を含む C プログラムを作成して少しレビューしましたが、バグに遭遇しました。

プログラムの私の期待される出力は次のとおりです。

.
.
.
A
.
.
.
.
.

しかし、私が得る出力は次のとおりです。

.
.
A     //Not meant to be 'A' but rather a '.'
A
.
.
.
.
.    

[0][2] の位置に余分な「A」を追加する方法と、この問題を解決する方法を考えています。

これが私のコードです:

#include <stdio.h>

void initArray(char shape[][2]);

main()
{
      char shape[2][2];
      int i, j;

      initArray(shape);
      shape[1][0] = 'A';
      printf("%c\n%c\n%c\n", shape[0][0], shape[0][1], shape[0][2]);  
      printf("%c\n%c\n%c\n", shape[1][0], shape[1][1], shape[1][2]);
      printf("%c\n%c\n%c\n", shape[2][0], shape[2][1], shape[2][2]);

      getchar();
}

void initArray(char shape[][2])
{
      int  i, j;

      for(i = 0; i < 3; i ++)
      {
            for(j = 0; j < 3; j++)
            {
                  shape[i][j] = '.';                  
            }
      }
}

ありがとうございます=D

4

2 に答える 2

3

< 2as としてshape宣言されているまでループする必要があるためshape[2][2]

 for(i = 0; i < 2;i++)
   for(j = 0; j < 2; j++)

shapeこれは、行と列0-1の両方を包括的に反復します

于 2013-08-31T15:48:56.603 に答える
1

考えられる方法は、多次元配列を避け、単純な配列を使用することです。char shape[2][2];次に、宣言する代わりに

 char shape[4];

shape[2*i+j]の代わりにコードを記述しますshape[i][j]。(ところで、コンパイラは後者を前者に変換します)。

デバッガー ( などgdb) を使用して、意味のある値があるかどうかiを確認します。jそして、適切な場所に追加assert(i>=0 && i<2)します。

char arr[4];(上記のように) 宣言された配列は、 0から3 (shapeつまり 4-1) のインデックスのみを受け入れるarr[0]ことを思い出しarr[3]てください。(標準に準拠する宇宙の崩壊を含む、C標準ごとに何でも起こる可能性があります)。この特定のエラーは非常に一般的であり、バッファ オーバーフローと呼ばれます。マルウェアで使用されます。arr[i]iarr[4]arr[17]arr[i+1]i

于 2013-08-31T15:50:10.083 に答える