14

最近、同僚に理由を説明しながら困惑しました

char a[100];
scanf("%s", &a); // notice a & in front of 'a'

非常に悪いことであり、それを行うための少し良い方法は次のとおりです。

char a[100];
scanf("%s", a); // notice no & in front of 'a'  

Ok。セキュリティ上の理由からscanfを使用すべきではない理由を教えてくれる準備をしているすべての人のために:リラックスしてください。この質問は、実際には「&a」と「a」の意味についてです。

問題は、なぜそれが機能しないのかを説明した後、私たちはそれを(gccで)試しました、そしてそれは機能します=))。私は素早く走った

printf("%p %p", a, &a);

同じアドレスを2回出力します。

誰かが私に何が起こっているのか説明できますか?

4

6 に答える 6

6

Cでプログラミングしてからしばらく経ちましたが、これが私の2cです。

char a[100]配列のアドレスに個別の変数を割り当てないため、メモリ割り当ては次のようになります。

 ---+-----+---
 ...|0..99|...
 ---+-----+---
    ^
    a == &a

比較のために、配列が malloc された場合、ポインター用に別の変数があり、a != &a.

char *a;
a = malloc(100);

この場合、メモリは次のようになります。

 ---+---+---+-----+---
 ...| a |...|0..99|...
 ---+---+---+-----+---
    ^       ^
    &a  !=  a

K&R 第 2 版。p.99はそれをかなりよく説明しています:

インデックス付けとポインター演算の対応は非常に密接です。定義により、配列型の変数または式の値は、配列の要素ゼロのアドレスです。したがって、代入後は同じ値pa=&a[0]; paになります。a配列の名前は最初の要素の場所の同義語であるため、代入は次のpa=&a[0]ようにも記述できます。pa=a;

于 2009-01-30T17:30:47.403 に答える
4

申し訳ありませんが、トピックから少し外れています:

これは、約 8 年前に C のコーディングをフルタイムで行っていたときに読んだ記事を思い出しました。記事が見つかりませんが、「配列はポインターではありません」などのタイトルだったと思います。とにかく、興味深い読み物であるこのC配列とポインターのFAQに出くわしました。

于 2009-01-30T16:57:20.077 に答える