2010-12-28 23 views
0

私はコードchar *に文字を渡し

int main() 
{ 
    char a[100]; 
    a[0]='a'; 
    a[1]='b'; 
    fun(a[0]); 
} 

void fun(char *a) 
{ 
    printf("%c",a); 
} 

しかしイムポインタはアドレスを期待されていないpointer.willに文字を渡すのこの作品を持っています?

+0

あなたは基本的に住所を送信しています。 – Falmarri

+0

はい、これは "とにかく"うまくいくかもしれませんが、運が良かったからです。間違いがあっても時にはうまくいかない理由よりも、正しいやり方に焦点を当てるほうがよいでしょう。 – aschepler

+0

ええと。ちょうど一連のコードスニペットを通り、実際にo/pを知りたがっています:) –

答えて

3

a[0]97(ASCIIで'a')を保持します。 funはの値をaに入力しますが、それをアドレスとして解釈します。ただし、printfにしか渡されておらず、フォーマッタを使用してacharと解釈すると、とにかくaという出力が表示されます。ほとんどのコンパイラでもちろん

、あなたはその警告を受ける必要があります(あなたがfunを呼び出すとき)あなたはポインタにキャストせずにポインタに整数に変換され

  1. printf%cフォーマッタは、char *ではなく、charになります。
1

呼び出しの時点でプロトタイプを持たない関数を呼び出しています。 C89ではこれが許されていると言いますが、最終的に定義されるパラメータに正しい引数で関数が呼び出されるようにすることはあなたの問題です。この場合は一致しないため、未定義の動作です。

コンパイラの警告をさらにオンにします(gccの場合は-Wall)。

+0

出力はどうですか? a [0] doestはaddreesを参照していますか? –

+0

@karthik:正しい、 'a [0]'はchar型で、値97です.97はアドレスとして解釈される可能性がありますが、有効なものと期待する根拠はありません。振る舞いは未定義なので、あなたの実装は 'a'を印刷することが許されます。呼び出し規約により、printfが '%c'形式のためにその値を取り出して文字として使用できるように、97の値が渡されました。しかし、あなたはそのことに頼る資格はありません。それはあなたの特定のコンパイラ、コンパイラオプション、および天気に起こったことだけです。 –

0

文字をポインタに渡すことはありません。

fun()は文字へのポインタを期待していますが、文字を渡しています。これは構文エラーを生成するはずです。少なくとも、関数fun()を宣言していないのであれば、正しく動作しません。

文字は、割り当て時にコピーされる整数型です。

+0

私は期待したものだが、o/pは「a」になる。私はGCCで試した –

+0

なぜそれがデバッガを介して実行されていないだろうと判断することはできません。しかしa [0]はポインタではありません。 (+ 0または単なるaがポインタであることに注意してください)。 –

0

解決策1:ポインタを使用しないでください。

void fun(char a); 

解決策2:あなたがここにいない明白な何らかの理由でポインタを使用する必要がある場合は、ポインタを間接参照するポインタと*を取得するために&を使用しています。

void fun(char *a); 
int main() 
{ 
    char a[100]; 
    a[0]='a'; 
    a[1]='b'; 
    fun(&a[0]); 
} 

void fun(char *a) 
{ 
    printf("%c",*a); 
} 
関連する問題