1

malloc()は浮動小数点数の配列を次のように作成していました。

float*x1;

x1 = (float*)malloc((vertexes/3)*sizeof(float)); 

if(x1 == NULL)
{
    printf("Out Of Memory");
    getchar(); return(1);
}

これまでのところ、私の限られた知識に基づいて上記は問題ないようですが、その配列を次のように使用しようとすると、 fscanf(stl,"%f",x1[N]);機能しません。x1 の後の括弧内の N は、通常はインクリメントされる変数ですが、テスト目的ですべてを引用し、たとえば 3 のような配列の範囲内にある任意の数値を使用しました。これを実行しようとすると、プログラムはコンパイルされ、fscanfコード行に到達するまで正常に実行されます。その時点でクラッシュし、ウィンドウは問題の解決策を見つけようとしていると言います。本来のように出力されx1[3] = 12345たので、動作しているように見える動的配列を使用してみました。これにより、問題が内部にあると信じるようになりますが、その理由はわかりません。printf("%f",x1[3]);12345fscanf(stl,"%f",x1[N]);

アドバイスをお寄せいただきありがとうございます。

4

1 に答える 1

3

ファミリでは、次のように入力する変数のアドレスscanfを指定する必要があります。

fscanf (stl, "%f", &(x1[N]));

C11標準から7.20.6.2 The fscanf function / 12(私の強調):

a,e,f,g:オプションで符号付きの浮動小数点数、無限大、または NaN に一致し、その形式は strtod 関数のサブジェクト シーケンスに期待されるものと同じです。対応する引数は浮動小数点へのポインタでなければなりません。


そして、他のいくつかのポイント:

  • Cからの戻り値を明示的にキャストすることはお勧めできませんmalloc。これにより、特定の微妙なエラーが隠される可能性があり、C はそれがなくても喜んで暗黙的にキャストします。
  • scanf正常にスキャンされたアイテムの数がわかるため、ファミリからの戻り値を確認することをお勧めします。それが求められたものでない場合は、適切な措置を講じる必要があります。
于 2013-08-14T01:38:22.047 に答える