31

私はCで動的1D配列を作成する方法を学んでいます。以下のコードは次のことを行おうとします。

  1. を使用して、タイプの値を保持するmalloc長さの動的配列を作成します。10double
  2. 配列の各エントリをj/100forに設定しj = 0, 1,..., 9ます。次に、それを印刷します。
  3. を使用して、配列の最後に空のエントリを追加しreallocます。
  4. 新しいエントリをに設定し、j/100各エントリを再度印刷します。

テスト:

 double* data = (double*)malloc(10*sizeof(double));

 for (j=0;j<10;j++)
 {
      data[j]= ((double)j)/100;
      printf("%g, ",data[j]);
 }

 printf("\n");

 data = (double*)realloc(data,11*sizeof(double));

 for (j=0;j<11;j++)
 {
     if (j == 10){ data[j]= ((double)j)/100; }
     printf("%g, ",data[j]);
 }

 free((void*) data);

質問

  1. 私はこれを正しくコーディングしていますか?

  2. 私が見つけたチュートリアルは、前にmalloc出さずに使用できます。(double*)例えば、

    int*ポインタ;
    ポインタ=malloc(2 * sizeof(int));

これは、Visual Studio 2010、Windows7ではコンパイルされません。エラーメッセージは次のとおりです。

タイプvoidの値をタイプのエンティティに割り当てることはできませんint

なぜそれは私ではなくそれらのチュートリアルで機能するのですか?私の例では、使用しているコンパイラが自動的にそれらを入力するためだと推測するのは正しい(int*)ですか?

4

3 に答える 3

40

あなたは近くにいます。

Cでは(少なくとも1989バージョンの標準以降)、Cは型の値をキャストなしに変換できるため、以前のキャストは不要mallocです。これはC++には当てはまらないため、発生するエラーに基づいて、このコードをCではなくC ++としてコンパイルしているように見えます。VS2010のドキュメントを確認して、コードをCとしてコンパイルする方法を確認してください。 reallocvoid *int *

malloc以下は、電話を書くための私の好みのスタイルです。

double *data = malloc(10 * sizeof *data);

式のタイプは、であるため、*dataはとdouble同等sizeof *dataですsizeof (double)mallocこれは、タイプが変更された場合に通話を調整する必要がないことも意味しますdata

呼び出しに関してはrealloc、結果を一時的なポインター値に割り当てる方が安全です。 reallocバッファを拡張できない場合はNULLを返すため、より安全に書き込むことができます

double *tmp;
...
tmp = realloc(data, 11 * sizeof *data);
if (!tmp)
{
  // could not resize data; handle as appropriate
}
else
{
  data = tmp;
  // process extended buffer
}

MicrosoftによるCのサポートは、1989バージョンの言語で終了することに注意してください。それ以来、言語標準の2つの改訂があり、いくつかの新機能が導入され、古い機能は廃止されました。そのため、一部のCコンパイラは、混合宣言やコード、可変長配列などのC99機能をサポートしていますが、VS2010はサポートしていません。

于 2012-10-01T15:18:18.167 に答える
12

1)私はこれを正しくコーディングしていますか?

多くの場合。ただしdata = (double*)realloc(data,11*sizeof(double));、失敗すると、割り当てられたメモリへの参照が失われreallocます。一時ポインタを使用しての戻り値を保持し、reallocそれがそうであるかどうかを確認するNULL必要があります(また、の戻り値も確認する必要がありますmalloc)。

2)私が見つけたチュートリアルでは、(double *)を前に置かずにmallocを使用しています。

Cでは、暗黙的に他のポインタ型に変換できるmallocaを返すため、キャストは必要ありません(エラーを隠す可能性があるキャストのため、広く推奨されていません)。void*Visual Studioは、キャストが必要な場合にコードをC++としてコンパイルするようです。

于 2012-10-01T15:11:18.413 に答える
5

Cでは、の戻り値をキャストしないでくださいmalloc()

また、malloc()引数に型をエンコードすることはお勧めできません。これはより良い方法です:

double* data = malloc(10 * sizeof *data);
于 2012-10-01T15:09:25.817 に答える