C のポインタと配列で問題があります。コードは次のとおりです。
#include<stdio.h>
int *ap;
int a[5]={41,42,43,44,45};
int x;
int main()
{
ap = a[4];
x = *ap;
printf("%d",x);
return 0;
}
コードをコンパイルして実行すると、次の警告が表示されます。
[警告] 代入により、キャストなしで整数からポインタが作成されます [デフォルトで有効]
行番号 9 (ap = a[4];) でターミナルがクラッシュします。行番号 9 を位置を含まないように変更すると (ap = a;)、警告は表示されずに動作します。なぜこのようなことが起こるのでしょうか? 答えは明らかなような気がしますが、わかりません。
ベストアンサー1
この場合、は配列 内の整数a[4]
で、は整数へのポインターなので、整数をポインターに代入しており、これが警告です。したがって、 が成立し、 を実行してこれを逆参照しようとすると、無効なアドレスであるアドレス 45 のメモリにアクセスしようとしているため、プログラムがクラッシュします。5th
a
ap
ap
45
*ap
あなたはすべきap = &(a[4]);
かap = a + 4;
配列名でc
は はポインタに縮小されるため、 はa
配列の最初の要素を指します。
このように、a
は と同等です&(a[0])
。