-2

最初に buf を配列に渡します。schArray[i][0] = buf;

たとえば、私はする必要があり bufますschArray

ABCDEFG to [0][0] 

1234567 to [1][0]

しかし、私はこの結果を行うことはできません

私の結果の2行目は最初の行を置き換えます

Time 1:  [0][0]  = ABCDEFG
         [1][0]  = null

Time 2 :[0][0]  = 1234567
        [1][0]  = 1234567

[0][0]を置き換えます

char ***schArray;

int q,k;

schArray = (char***)malloc(sizeof(char*)*1000);
for(q = 0; q < 1000; q++){

    schArray[q] = (char**)malloc(sizeof(char)*100);

    for(k = 0; k < 1000; k++){
        schArray[q][k] = (char*)malloc(sizeof(char)*100);
    }
}

while(strncmp(buf, KEYWORD_endP,KEYWORD_PS_SZ)!=0){
  schArray[commandnum][0] = buf;

  printf("%s\n",schArray[0][0]);
  printf("%s\n",schArray[1][0]);
  printf("%s\n",schArray[2][0]);

  val=printCommand(buf);

  printf("child: %d\n",val);

  // printf("child:%d",val);

  memset(buf, 0, 80);

  write(cTop[i][1],&buf,80*sizeof(char));
  read(pToc[i][0],&buf,80*sizeof(char));
  commandnum++;
}

期待される出力

ABCDEFG 

1234567 

実際の出力

1234567

1234567
4

2 に答える 2

1

主な問題は次の行です。

schArray[commandnum][0] = buf;

これは のコピーを作成しません。buf配列要素が の場所を指すように設定しますbuf。したがって、同じバッファを指しているたびに。

strcpy()バッファを配列要素にコピーするために使用する必要があります。

strcpy(schArray[commandnum][0], buf);

別の問題は、を呼び出すループmalloc()にあり、sizeofパラメーターが正しくありません。

schArray = malloc(sizeof(char**)*1000);
for(q = 0; q < 1000; q++){
    schArray[q] = malloc(sizeof(char*)*100);
    for(k = 0; k < 1000; k++){
        schArray[q][k] = malloc(sizeof(char)*100);
    }
}

の結果をキャストする必要もありませんmalloc()。が返されvoid*、これは必要に応じて自動的に変換されます (C では、C++ ではなく)。#included明示的なキャストを含めると、を宣言するan を忘れるなど、他のエラーを隠すことができmalloc()ます。

于 2013-04-25T19:32:51.053 に答える
1

文字へのポインターにポインターの大量の配列を割り当てないでください。初心者の C プログラマーは、多くの場合、最初は配列の使用に慣れています。次に、より複雑なものに移り、2 次元配列の使用を開始したいと考えています。その後、彼らは自分たちのものをヒープに移動しなければならないことに気づき、C配列スキームを手放すことができず、もっと便利なものに移ることができないようです.

myarray[3][4]特に、 x=3、y=4 の要素にアクセスする場合など、C 配列構文を使用して要素にアクセスする必要はありません。自分で計算を始めて、自分自身 (および他の人) を大きな頭痛の種から救う時が来ました。

#define MY_ARRAY_HEIGHT 1000
#define MY_ARRAY_WIDTH 1000

static inline char getElement(char *myArray, unsigned x, unsigned y) {
    return myArray[x + y * MY_ARRAY_WIDTH];
}

int main(void) {
    char *myArray = malloc (MY_ARRAY_HEIGHT * MY_ARRAY_WIDTH);

    // initialize it, etc.
    printf("element at 3,4 = %d\n", getElement(myArray, 3, 4));
    return 0;
}
于 2013-04-25T19:33:16.947 に答える