アプリ版:「スタンプのみでお礼する」機能のリリースについて

#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

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

A 回答 (5件)

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

って書いてます。
コンパイルエラーの読み方を学びましょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/15 19:35

や, 規格に従った処理系である限り


char a[8];
に対して &a[8] は OK です>#4. これは自動的に a+8 と解釈され, 意味のある値であることが保証されています.
もちろん &a[9] や &a[-1] はアウト.
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/15 19:43

単純に変数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]のメモリアドレスを表示
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/15 19:42

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

ってところでしょう。
    • good
    • 4
この回答へのお礼

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

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

お礼日時:2010/04/15 19:38

ざっと見た感じだと、


>char a[8],b[7],c[6];

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

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

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

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

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

お礼日時:2010/04/15 19:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています