1

The C++ Programming Language (Third Edition and Special Edition) の 113 ページで、Stroustrup は次のように述べています。

struct address {
char * name ; // "Jim Dandy"
long int number ; // 61
//...
};

void f ()
{
address jd ;
jd.name = "Jim Dandy"; // Is this possible?
jd.number = 61 ;
}

jd の char* フィールドにメモリが割り当てられていないため、これは可能ですか?

更新: ご回答いただきありがとうございます。安全ではないため、使用しません。単行本で見ただけで気になりました。

4

2 に答える 2

2

へのポインターを保持するのに十分なメモリが割り当てられchar、割り当てにより、文字列を保持する静的バッファーを指すようにポインターが設定される"Jim Dandy"ため、はい、これは可能です。文字列はコピーされないため、割り当ては必要ありません。

(ただし、 achar*を文字列リテラルに設定することは非推奨です。char const*代わりに a を使用してください。)

于 2012-07-03T14:45:17.457 に答える
2

メモリが割り当てられました。ポインタには十分です。これで、文字列を含む静的配列がポイントされます。

文字列のコピーを構造体に入れることを期待していた場合、それは C スタイルの文字列の動作ではありません。その動作が必要な場合は、std::string代わりに C++ クラスを使用してください。

この例が、これがどれほど危険であるかを説明してくれることを願っています。静的配列は定数ですが、言語の癖により、constそれを指す非ポインターを割り当てることが許可されています。これにより、定数オブジェクトを変更しようとするコードを記述できます。これにより、実行時に未定義の動作が発生します。

jd.name[0] = 'T'; // BOOM! Undefined behaviour.

運が良ければ、コンパイラはその間違いについて警告するかもしれません。ポインタを宣言することでそれを防ぐことができますconst:

char const * name;
...
jd.name[0] = 'T'; // Gives a friendly compile-time error
于 2012-07-03T14:47:29.647 に答える