0

C の初心者です。ANSI C プログラム (Linux 上で gcc 4.4.6 を使用) を作成しており、プログラムの実行時に配列の長さが決定される int や double などの数値配列を初期化する方法を知る必要があります。走る?

ANSI C では、変数を宣言し、コードを実行して (長さが決定される)、追加の変数 (問題の配列など) を宣言できますか?

そうでない場合、これは実際にどのように行われますか? プログラムがgcc -ansi ...switch を使用してコンパイルされることに注意してください。

4

4 に答える 4

4

配列にメモリを割り当て、完了後に解放する必要があります。

mallocfreeを参照して、ここにリストされている初心者向けの書籍のいずれかを入手してください。確固たる基礎なしに C を書こうとすると、血と涙とセグメンテーション違反に終わります。子供たちのことを考えてください。やらないでください。

自分の足を撃ち始めるための例:

int* intarray = NULL;
intarray = (int*)malloc(sizeof(int) * 23); // allocate space for 23 intS
于 2012-04-04T21:00:35.730 に答える
2

動的配列を作成するには、代わりにポインターを使用します。使い方はほとんど同じですが、使い終わったらメモリを free() する必要があります。

int staticArray[10];
int *dynamicArray;

// calculate length of the dynamic array here
int length = 3*4;

dynamicArray = (int*)malloc(length * sizeof(int));

staticArray[4]  = 7;
dynamicArray[8] = 5;

free(dynamicArray);
于 2012-04-04T21:02:55.700 に答える
1

スタックにデータを割り当てたい場合 (および利用可能な場合)はお勧めallocamallocますが、malloc はほとんどの状況で機能します。

でコンパイルされた場合でも、GCC では柔軟な長さの配列を使用できることに注意してください-ansi

int size = 0;
printf("please enter array size: ");
scanf("%i", &size);

data_type data[size];

ただし、動的に割り当てる必要がある場合は、最後の行を次のように置き換えるだけです。

data_type *data = alloca(size * sizeof(*data)); 
于 2012-04-04T21:09:48.943 に答える
1

ANSI C では、変数を宣言し、コードを実行して (長さが決定される)、追加の変数 (問題の配列など) を宣言できますか?

1999 年の標準では、ブロック内で宣言とコードを混在させることができます。それ以前は、ブロック内のすべての宣言はコードの前に置く必要がありました。C99 用にコンパイルするには、-std=c99代わりに-ansi( と同義-std=c89) を使用します。したがって、以下は C99 では有効です。

int main(void)
{
  int size;

  // get the size somehow

  int *array = malloc(sizeof *array * size);
  ...
  // don't forget to clean up when you're done
  free(array);
}

フラグを指定してコンパイルする必要がある場合-ansi(つまり、C89 標準に準拠する必要がある場合)、次のようにコードを構成する必要があります。

int main(void)
{
  int size;
  int *array; 

  // get size somehow

  array = malloc(sizeof *array * size);
  ...
  free(array);
}

C99 は可変長配列もサポートしていることに注意してください。これにより、実行時に配列のサイズを指定できます。

int main(void)
{
  int size;

  // get size as before

  int array[size];
  ...
}

VLA は、通常の配列に比べていくらか制限されており (構造体または共用体型のメンバーにすることはできず、関数の外に表示することもできません)、注意して使用する必要があります。多くのスペースを割り当てる必要がある場合は、malloc代わりに使用してください。それらの実装は非常に複雑であることが判明したため、最近承認された 2011 年の標準では、実装にそれらをサポートし ないオプションが与えられています。

于 2012-04-04T21:55:01.447 に答える