メモリはポインタオブジェクトここで私は、strはメモリ割り当てを行わず、「確認」することを指している方法を知りたいメモリ割り当て
char *str = "Check";
char *str1 = new char[6];
に割り当てられている方法(新しい使用)。 strを印刷するときに "Check"が表示されます。私は両方の違いを助けることができます。 。
メモリはポインタオブジェクトここで私は、strはメモリ割り当てを行わず、「確認」することを指している方法を知りたいメモリ割り当て
char *str = "Check";
char *str1 = new char[6];
に割り当てられている方法(新しい使用)。 strを印刷するときに "Check"が表示されます。私は両方の違いを助けることができます。 。
str
は、コンパイラによって割り当てられたメモリ、通常は読み出し専用メモリを指しています。
コンパイラは、実行可能ファイルの読み取り専用セクションにCheck\0
を出力し、割り当てをstr
に設定すると、str
はその場所を指します。
"自動"変数のメモリはヒープから割り当てられません(new
はそのメモリを取得します)。実際には、これらのローカル変数は一般的にスタックにあります。多くの場合、CPUレジスタに直接入れることもできます。
まず、 "ポインタ"と "オブジェクト"は、C/C++の異なる用語です。 "ポインタ"は、 "オブジェクト"(データ型)のアドレスを保持するエンティティです。
str
は、コードのをコンパイル中に静的に割り当てられたのメモリ領域を指しています。プログラムが終了するまで、"Check"
もそこに残ります。
このメモリは固定サイズで、の読み取り専用コード領域にあります。また、その記法はC++では廃止予定です。これは、多くの答えをniptikingけど...縫い目があり、
const char *str = "Check"; // "Check" is not modifiable
^^^^^
でなければなりません「コンパイラによって割り当てられたメモリ」について話す:それは実際には真実ではない:メモリは、プログラムを実行するプロセスにOSによって与えられ、コンパイラではなく、
コンパイラは実際に、リンカに知られているオフセットを持つ実行可能ファイルの一部にリテラルを格納します。オフセットはリンカに「スタートアップ関数」に与えます。 OSがファイルをメモリにロードし、ロードアドレスにすべてのオフセットを追加して、すべてのオフセットをアドレスに変換し、スタートアップ関数を呼び出すよりも「スタック」を作成します。 スタートアップ関数は "ヒープ"を作成し、すべてのグローバル&スタティックオブジェクトのコンストラクタを呼び出し、mainを呼び出します。この時点で"Check"
は、指定されたアドレスから始まる一連のバイトです。そのアドレスはstr
に与えられたものです。
したがって、メモリは「コンパイラによって割り当てられません」。これはプログラム起動フェーズ中に割り当てられ、コンパイラによって以前に保存されたデータで初期化されます。
タイトルは誤解を招きます。ポインタの値ではなく、 '' Check ''がどこに格納されているかを尋ねています。 (私は思う:/) – tenfour
'str'が指しているメモリはスタックにはありません。 –