C ポインタと配列: [警告] 代入により、キャストなしで整数からポインタが作成されます [closed] 質問する

C ポインタと配列: [警告] 代入により、キャストなしで整数からポインタが作成されます [closed] 質問する

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 のメモリにアクセスしようとしているため、プログラムがクラッシュします。5thaap
ap45*ap

あなたはすべきap = &(a[4]);ap = a + 4;

配列名でcは はポインタに縮小されるため、 はa配列の最初の要素を指します。
このように、aは と同等です&(a[0])

おすすめ記事