0

関数への配列の受け渡しについて疑問があります。

次のコード スニペットを検討してください。

void main()
{
    int a[4]={10,20,30,40};
    fun1(a);
}

void fun1(int a1[])
{
  for(int i=0;i<4;i++)
  {
      printf("%d\n",a1[i]);
  }
}

配列を渡すことは、最初の場所のアドレスを渡すことに他なりません。そして、上記の配列をその名前(配列の開始アドレス)とともに渡す必要があります。私の疑問は、 a[4] は自動変数であるため、メイン関数から出ると死ぬはずであり、予期しない結果をもたらすはずです(ポインターがぶら下がっているはずです)。しかし、それはうまく機能しています。

私はこれについて非常に混乱しています、あなたはそれをクリアしてもらえますか.

単一の要素int aを として渡してもf(&a)、automatic (main 関数のローカル変数) として宣言されている場合は、関数 f に存在してはなりません。

これもクリアしてください。

4

4 に答える 4

7

はい、変数aは終了時にスコープ外になりmain()ます。

しかし、 whenfun1は実行中でmain()あり、まだ終了に達していないため、 の内容aはまだ完全に有効です。

于 2012-07-27T07:12:10.407 に答える
3

あなたがしていることは問題ありません。配列aは確かに範囲外になりますが、その時点までに関数は終了しているため、存在しないデータへのアクセスについて心配する必要はありません。変数を配列名として渡すことに懸念がある場合 (これは問題ありません)、いつでもコードをステップ実行して、自分が思っているデータにアクセスしていることを確認できます。

また、配列を 4 としてハード コードするのではなく、配列のサイズを指定する追加の整数引数を渡すことによって、関数をより安全にすることもできます。範囲外のメモリにアクセスしています。

于 2012-07-27T07:18:12.620 に答える
1
  1. void fun1 ( int a1[]) は、関数に入ってくる配列のコピーを作成しています。だからそれは存在するでしょう。

  2. スタックとして視覚化することもできます。main() メソッドのスタックが作成されます。また、fun1() は main メソッドから呼び出されるため、fun1() のスタックが破棄された場合にのみ、main メソッドのスタックが破棄されます。

于 2012-07-27T07:22:37.287 に答える
0

int a[]関数の宣言/定義では等しいconst int *aので、悪いことは何も起こらず、暗黙的にメモリが解放されることもありません。

于 2012-07-27T07:12:32.363 に答える