2017-03-22 6 views
0

ポインタを使用して文字列を宣言すると、ポインタには文字列リテラルのメモリアドレスが含まれています。したがって、私はこのコードからメモリアドレスを取得することを期待していましたが、むしろ乱数を取得しました。なぜそれがうまくいかなかったのか理解してください。ポインタhiはリテラル文字列のメモリアドレスが含まれている場合charポインタを使用して宣言された文字列のメモリアドレス

int main() 
{ 
    char *hi = "Greeting!"; 
    printf("%p",hi); 
    return(0); 
} 

、そしてなぜそれがないメモリアドレスが表示されたのですか?

+0

しかし、私はいくつかの乱数を得ました_...あなたの出力は何ですか? – LPs

+2

乱数の集合ではない場合、メモリアドレスがどのように見えると思いますか? – nwp

+1

charポインターは、文字列リテラルのアドレスを指します。それはアドレス –

答えて

1

正常に機能しました。アドレスは、Cランタイムによって任意に選択されたものとみなすことができます。 hiは、文字列の大文字のGのアドレスに設定されたポインタです。 hiからその文字列の末尾にあるnul-terminatorまでのすべてのメモリを所有しています。

はまた、const char *hi = "Greeting!";はなくchar *使用:hiから始まるメモリがある読み取り専用。文字列を変更しようとしないでください。その行為は、が定義されていませんです。

0

「乱数」はメモリアドレスです。あなたのプログラムが実行されるたびに、他のメモリアドレスが使用されるので、それらは一定ではありません。

0

ポインタはいくつかの方法で表現できます。書式文字列"%p"は、 "ポインタを定義する実装定義文字シーケンスを書き込みます"​​。ほとんどの場合、指し示されたオブジェクトのアドレスは、「乱数の束」のように見える、適切なサイズの符号なし整数として解釈されます。

ユーザが読めるポインタ表現は、一般にデバッグにのみ有効です。 2つの異なる表現(ポインタは同じですか?)と場合によっては、ポインタの相対的な順序と距離(ポインタが「最初」になり、どれくらい離れているか)を比較できます。整数としてポインタを解釈することは、この光学系でうまくいきます。

期待した出力を明確にすることができれば幸いです。おそらくポインタがゼロベースであることを期待していたでしょうか?

一部のコンパイラがあなたの例を受け入れているかもしれませんが、const char *を使用する方が賢明でしょう。 char *を使用すると、文字列リテラルを変更できますが、これは未定義の動作です。

関連する問題