1

文字列をdoubleの動的配列に変換しようとしています。文字列の各スペースは、各「;」の列を表します。新しい行を表します。このコードを実行すると、* F[0][col]の場合にのみ機能します。* F [1] [col]に到達すると、「CCode.exeの0x00e4483cで未処理の例外:0xC0000005:アクセス違反の読み取り場所0xcccccccc」というエラーが表示されます。誰もが理由を知っていますか?

void main(void) {  
    double **F = NULL;  
    F = malloc(row * sizeof (double *));  
    for (m=0; m < row;m++) {  
        F[m] = malloc(col * sizeof(double ));
    }  
    FParser(string, &F);
for (m=0;m<rowF;m++)
    free(F[m]);
free(F);
}

void FParser(char string[256], double ***F) {  
  while (dummyChar_ptr != NULL) {
    dummyChar_ptr = strtok(dummyChar_ptr," ");
    while ((dummyChar_ptr) != NULL) {
      *F[row][col] = atof(dummyChar_ptr);
      dummyChar_ptr = strtok(NULL," ");
      col++;
    }
    col=0;
    row++;
    strcpy(dummyChar,string);
    dummyChar_ptr = strtok(dummyChar,";");
    for (x=0;x<row;x++) 
      dummyChar_ptr = strtok(NULL,";");  

  }

//example String: 1 0.1 0 0; 0 1 0 0; 0 0 1 0.1; 0 0 0 0.1
4

1 に答える 1

8

[]*Cでは単項よりも優先順位が高いので*F[row][col]、実際*(F[row][col])にはそうです。間違ったメモリ位置にインデックスを付けています。

試してみてください(*F)[row][col])

ちなみに、とにかく FParser取る理由はありません。すでにポインタです。それを渡すだけです。追加レベルの間接参照を使用する必要がある唯一の理由は、が指すものを変更する必要がある場合です。double***FFParsermain()F

その他のアドバイス:

  • malloc成功したかどうかを確認します。
  • グローバル変数は避けてください。
  • strcpyソース文字列が宛先バッファをオーバーフローしないことを確認していない限り、使用しないでください。
  • 関数パラメーターchar string[256]は、入力引数が256(またはそれ以上)の要素の配列であることを実際に保証するものではないため、IMOは無意味であり、そうである可能性もありますchar* string
于 2010-01-24T06:20:53.857 に答える