みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

#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

と出てしまいました。原因が良く分からないのですが教えて頂けますでしょうか?

投稿日時 - 2010-04-15 16:31:36

QNo.5828050

すぐに回答ほしいです

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

>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がここにありますよ

って書いてます。
コンパイルエラーの読み方を学びましょう。

投稿日時 - 2010-04-15 16:46:53

お礼

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

投稿日時 - 2010-04-15 19:35:55

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

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

投稿日時 - 2010-04-15 17:40:08

お礼

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

投稿日時 - 2010-04-15 19:43:46

ANo.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]のメモリアドレスを表示

投稿日時 - 2010-04-15 17:03:42

お礼

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

投稿日時 - 2010-04-15 19:42:45

ANo.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って名前使ってるよな、オラァ!!

ってところでしょう。

投稿日時 - 2010-04-15 16:58:43

お礼

>>test.cの中で31行目に書かれてるcって名前は衝突してるぜ、オィ!!
>>test.cの中で4行目に、既にcって名前使ってるよな、オラァ!!

ってところでした。ありがとうございました。

投稿日時 - 2010-04-15 19:38:48

ANo.2

ざっと見た感じだと、
>char a[8],b[7],c[6];

>char *c="abcdefghijklmn";
が多重定義扱いになるんじゃないかな?

それと、利用しているコンパイラによっては変数宣言は全て関数の最初に記載しないといけないものもあるので注意。

投稿日時 - 2010-04-15 16:57:07

お礼

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

>>それと、利用しているコンパイラによっては変数宣言は全て関数の最初に記載しないといけないものもあるので注意。

そんなのもあるんですね。勉強になりましたありがとうございました。

投稿日時 - 2010-04-15 19:37:45