10

ローカル変数は自動変数とも呼ばれ、関数がアクセスされたときに実行時にメモリが割り当てられることになっています。

int main(){
    int a; // declaration 
    return 0;
}

int main(){
    int a[]; // compilation error, array_size missing
    return 0;
}

int main(){
    int a[2]; // declaration, but can't work without array_size, 
              // so at compile time it is checked!
    return 0;
}

私の質問は、Cの宣言でarray_sizeを指定するのが単なるルールなのか、それとも配列のコンパイル時にメモリが割り当てられるのかということです(まだローカル変数)

それはどのように機能しますか?

配列は、K&R による C プログラミングによる変数です。pg no 161。

4

8 に答える 8

1

Cのローカル変数と自動変数には違いがあります。ローカル変数は自動または静的ありプログラムが最初に実行されたときに、そのメモリがスタックに割り当てられるか、永続的に割り当てられるかを決定します。

このコードで:

int main(){
  int a[];    //compilation error, array_size missing
  return 0;
}

これは不完全な配列です。intエラーは、コンパイラがプログラムが割り当てる必要のあるsの数を認識していないためです。

于 2013-03-13T13:12:21.113 に答える
0

配列のサイズはコンパイル時に知る必要があり、可変サイズの配列を除いて、メモリはコンパイル時に決定され実行時に割り当てられるため、サイズを配列に直接または間接的に渡すことができます。

于 2013-03-13T13:40:36.160 に答える
0

関数の引数やローカル変数などの自動変数を宣言すると、自動割り当てが発生します。自動変数のスペースは、宣言を含む複合ステートメントに入ると割り当てられ、その複合ステートメントを終了すると解放されます。

于 2013-03-13T12:45:26.423 に答える
0

それが、配列とポインターが同じではない C のポイントです。

次の例を見てください。

int main(){
   int a[5];
   int * b = malloc(sizeof(int) * 5);

  printf("sizeof a = %d\n",sizeof a);
  printf("sizeof int[5] = %d\n",sizeof(int[5]));
  printf("sizeof b = %d\n",sizeof b);

  free(b);
  return 0;
}

これは以下を返します:

sizeof a = 20
sizeof int[5] = 20
sizeof b = 4

変数 a は、int[5] として内部宣言されています。これは、5 つの整数用のスペースを持つメモリ ブロックを指す整数ポインターです。

于 2013-03-13T12:47:20.337 に答える
0

ローカル変数の場合、それらが消費するメモリはスタックにあります。これは、関数が呼び出されたときに、スタック ポインターの値を変更することにより、必要な正確な量のメモリがスタックに追加されるように、コンパイル時に既知の固定サイズが必要であることを意味します。これが、配列にサイズが必要な理由です。スタック上のバ​​イト数は、関数が呼び出されたときに固定量だけ変化する必要があります。

malloc() などの呼び出しは、ヒープからメモリを割り当てます。実行時にこの方法で割り当てられるメモリは、可変サイズにすることができます。

于 2013-03-13T12:47:44.510 に答える
0

コメントで sgar91 が述べたように、関数が呼び出されたときに例のような配列が割り当てられ、サイズが確定している必要があります。動的配列が必要な場合は、ヒープにメモリを割り当てる必要があります。

int *values = malloc(sizeof(int) * array_count);
于 2013-03-13T12:36:28.050 に答える