[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
2022-01-24 22:11:34
質問
このコードを使うと、GCCは「互換性のないポインタ型からの初期化」という警告を出します(コードは問題なく動作し、配列のすべての要素を表示するという、想定されたことを行いますが)。
#include <stdio.h>
int main(void)
{
int arr[5] = {3, 0, 3, 4, 1};
int *p = &arr;
printf("%p\n%p\n\n", p);
for (int a = 0; a < 5; a++)
printf("%d ", *(p++));
printf("\n");
}
しかし、次のコードを使用しても警告は表示されません。
int main(void)
{
int arr[5] = {3, 0, 3, 4, 1};
int *q = arr;
printf("%p\n%p\n\n", q);
for (int a = 0; a < 5; a++)
printf("%d ", *(q++));
printf("\n");
}
この2つのスニペットの唯一の違いは、*p = &arr と *q = arr を代入していることです。
- 正確に言うと、& はどのような違いをもたらすのでしょうか?
- また、なぜ両方のケースでコードが実行され、まったく同じ出力が得られるのでしょうか?
解決方法は?
-
&arr
を与える。 配列ポインタ という特殊なポインタ型int(*)[5]
で、配列全体を指し示す。 -
arr
のような式で書かれた場合int *q = arr;
は、最初の要素へのポインタに分解されます。と完全に等価です。int *q = &arr[0];
最初のケースでは
int(*)[5]
を
int*
. これらは互換性のないポインタ型であるため、コンパイラの診断メッセージが表示されます。
結局のところ、配列ポインタと最初の要素への int ポインタは同じ表現で、内部的には同じアドレスになる可能性が非常に高いのです。このため、最初の例は正しいC言語ではないにもかかわらず、quot;work"なのです。
関連
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み] printf ファミリーを使用して、size_t 変数をポータブルに印刷するにはどうすればよいですか?
-
[解決済み] スマートポインターとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] 配列からポインタへの減衰とは何ですか?