• ベストアンサー

コンパイルエラーについて

#include <stdio.h> int main(void){ char a[8],b[7],c[6]; printf("a[8]のアドレスは%pです。\n",&a[8]); //a[8]のメモリアドレスを表示 printf("\n"); printf("b[7]のアドレスは%pです。\n",&b[7]); //b[7]のメモリアドレスを表示 printf("\n"); printf("c[6]のアドレスは%pです。\n",&c[6]); //c[6]のメモリアドレスを表示 printf("\n"); char *c1 ="abcde"; printf("c1=%s\n",c1); //abcdeを表示 printf("c1[2]=%c\n",*(c1+2)); //先頭アドレスの2つ先のアドレスに格納されている値(c)を表示 char c2[] ="abcde"; char *pc2; printf("c2=%s\n",c2); //abcdeを表示 pc2=&c2[2]; //変数c2[2]のアドレスを格納 printf("c2[2]=%c\n",*pc2); //c2[2]アドレスに格納されている値(c)を表示 char *c="abcdefghijklmn"; char cc[]="opqrstuvwxyz"; printf("%c\n", *(c+7)); printf("%c\n", *(cc+2)); return 0; } としてコンパイルした所、 test.c: In function ‘main’: test.c:31: error: conflicting types for ‘c’ test.c:4: note: previous declaration of ‘c’ was here と出てしまいました。原因が良く分からないのですが教えて頂けますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>char a[8],b[7],c[6]; >char *c="abcdefghijklmn"; 変数cをダブって定義しようとしているためです。 >test.c:4: note: previous declaration of ‘c’ was here test.cの4行目 注記:前に定義したcがここにありますよ って書いてます。 コンパイルエラーの読み方を学びましょう。

nardobrea
質問者

お礼

偶然出会ったサイトに、そのように書いてありました。 かなり単純でしたね。今度からは気を付けたいと思います。 ありがとうございました

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

や, 規格に従った処理系である限り char a[8]; に対して &a[8] は OK です>#4. これは自動的に a+8 と解釈され, 意味のある値であることが保証されています. もちろん &a[9] や &a[-1] はアウト.

nardobrea
質問者

お礼

ありがとうございました。おかげでスムーズに動きました。

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.4

単純に変数cが二重定義ということでしょう。 4行目で、文字配列と定義し、31行目でポインター変数として定義 している為。 31行目のポインター変数名を変えればOK。 後、下記はNGです。 printf("a[8]のアドレスは%pです。\n",&a[8]); //a[8]のメモリアドレスを表示 printf("b[7]のアドレスは%pです。\n",&b[7]); //b[7]のメモリアドレスを表示 printf("c[6]のアドレスは%pです。\n",&c[6]); //c[6]のメモリアドレスを表示 文字配列変数aの添え字は0~7 文字配列変数bの添え字は0~6 文字配列変数cの添え字は0~5 なので定義を変える。 char a[9], b[8], c[7]; またはprintf文を変えなければならないです。 printf("a[7]のアドレスは%pです。\n",&a[7]); //a[7]のメモリアドレスを表示 printf("b[6]のアドレスは%pです。\n",&b[6]); //b[6]のメモリアドレスを表示 printf("c[5]のアドレスは%pです。\n",&c[5]); //c[5]のメモリアドレスを表示

nardobrea
質問者

お礼

他の至らない点まで指摘して頂きありがとうございました。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.3

test.c:31: error: conflicting types for ‘c’ test.c:4: note: previous declaration of ‘c’ was here 翻訳すると、 test.cの中で31行目に書かれてるcって名前は衝突してるぜ、オィ!! test.cの中で4行目に、既にcって名前使ってるよな、オラァ!! ってところでしょう。

nardobrea
質問者

お礼

>>test.cの中で31行目に書かれてるcって名前は衝突してるぜ、オィ!! >>test.cの中で4行目に、既にcって名前使ってるよな、オラァ!! ってところでした。ありがとうございました。

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.2

ざっと見た感じだと、 >char a[8],b[7],c[6]; と >char *c="abcdefghijklmn"; が多重定義扱いになるんじゃないかな? それと、利用しているコンパイラによっては変数宣言は全て関数の最初に記載しないといけないものもあるので注意。

nardobrea
質問者

お礼

偶然出会ったサイトに、そのように書いてありました。 かなり単純でしたね。今度からは気を付けたいと思います。 ありがとうございました >>それと、利用しているコンパイラによっては変数宣言は全て関数の最初に記載しないといけないものもあるので注意。 そんなのもあるんですね。勉強になりましたありがとうございました。