4
void f(int *a, int n)
{
     int i;
     for (i = 0; i < n; i++)
     {
         printf("%d\n", *(a+i));
     }
 }

上記のコードは、次のようmain()に呼び出した場合に正常に機能しました。

int a[] = {1,2,3};
int *p = a;

f(a, 3);

しかし、の場合main()、私はしました:

int *a =(int*) {1,2,3};

f(a, 3);

その後、プログラムがクラッシュします。これは奇妙に見えるかもしれませんが、私は勉強していて違いを知りたいと思っています。

4

1 に答える 1

9

キャストのせいです。この行は言う:

int *a =(int*) {1,2,3};

配列{1,2,3}をintへのポインタとして扱います。32ビットマシンでは、ポインタの値はになりましたが1、これは必要な値ではありません。

ただし、次の場合:

int *p = a;

コンパイラーは、配列名を最初の要素へのポインターに減衰できることを認識しています。それはあなたが実際に書いたようなものです:

int *p = &(a[0]);

a同様に、関数の引数として使用すると、コンパイラーも配列名をポインターに減衰させるため、関数に直接渡すことができます。

int a[] = {1,2,3};
int *p = &(a[0]);

f(p, 3) 
f(a, 3); // these two are equivalent
于 2012-04-19T01:38:49.997 に答える