c / c ++では、次のようなcスタイルの文字列を使用する人もいます。
char *str = "This is a c-styled string";
私の質問はこれは安全ですか?私の見方では、彼らはcharのconst配列の最初の文字を指すcharポインターを作成しましたが、他の何か、たとえば別の変数がメモリ内のchar配列の一部を上書きすることはできませんか?したがって、strを論理的に無効にしますか?
最近では、文字列定数はバイナリの読み取り専用セクションに配置されています。読み取り専用セクションのアドレスに書き込もうとすると、CPUのメモリ管理ユニットで障害が発生し、アプリケーションでアクセス違反やセグメンテーション違反、またはその他のオペレーティングシステムに依存する動作が発生します。
また、文字列定数の型を非定数として宣言すると、コンパイラは警告を発します。
しかし、他の何か、たとえば別の変数がメモリ内のchar配列の一部を上書きすることはできませんか?
彼らはそれをしてはいけません。その理由は、C文字列リテラルが定数であり、正しく1つとして宣言する必要があるためです。
char const* str = "This is a c-styled string";
(非const)コードは、レガシーCコードとの互換性がない場合にのみ許可されます。データを変更しようとすると、未定義の動作が発生します。
物事はあなたがそれらを作るのと同じくらい安全です。文字列と同じように、スタック上の整数を簡単に上書きできます。実際、質問にあるものは、読み取り専用メモリセクションに配置される可能性があるため、(一部のシステムでは)より安全です。
自分が何をしているのかわからない場合は、Cを使用しないでください。彼らが適切な訓練なしにチェーンソーを使うべきではないのと同じように。Cの存在理由全体は、システムプログラミング言語でした。それはあなたが望むことをするための完全な力をあなたに与えます。そして力には責任が伴います。
安全ではありません。しかし、C /C++の他のものもそうです。他のオブジェクトが使用するメモリの部分を簡単に上書きできます。
彼らはあなたのプログラミングの練習と同じくらい安全です。それらを適切に操作する方法を知っている限り、それらは完全に安全です。チャイナショップの象を思わせるプログラミングスタイルの人にとって、そのような文字列は安全ではないかもしれません。しかし、C /C++言語全体についても同じことが言えます。
元の1行の宣言の例では、すでに安全でないスタイルの問題が発生しています。CとC++の両方で、文字列リテラルは変更できない左辺値です。そのようなリテラルを指す[長寿命の]非定数ポインターを作成することはお勧めできません。通常、次のようになります。
const char *str = "This is a c-styled string";
余分な「const」に注意してください。
(この特定のルールはCで常に従うことはできませんが、通常は、適切に制御されたローカライズされた慣用句でのみ違反する必要があります。)
実際にはこれを行わないでください。
int *foo = 0x1234;
byte[] bytes = (byte[]) foo;
bytes[0] = 0x56;
printf("%d\n", *foo);
とはいえ、ポインタを誤用すると危険です。
「安全」の意味によって異なります。
これらは、C /C++での他のポインターの使用よりも本質的に安全です。ポインタを使用するには、一般的にメモリに十分注意する必要があります。