5

私は、主に C++ を使用し、c スタイルの文字列を使用する既存のコードを使用するプロジェクトに取り組んでいます。次のようにします。

#include <iostream>
int main(int argc, char *argv[])
{
    char* myString = "this is a test";
    myString = "this is a very very very very very very very very very very very long string";
    cout << myString << endl;
    return 0;
}

これはコンパイルされ、出力が長い文字列で正常に実行されます。

しかし、なぜそれが機能するのかわかりません。私の理解は、

char* myString 

文字列リテラル「これはテストです」を保持するのに十分な大きさのメモリ領域へのポインタです。その場合、どうすればもっと長い文字列を同じ場所に保存できますか? 長い文字列を短い文字列用に取っておいたスペースに詰め込もうとしたため、これを行うとクラッシュすることが予想されました。

明らかに、ここで何が起こっているのかについての基本的な誤解があるので、これを理解する助けに感謝します.

4

6 に答える 6

5

メモリには2つの文字列があります。1つ目は"this is a test"、アドレス0x1000から始まるとしましょう。2つ目は"this is a very very ... test"、アドレス0x1200から始まります。

char* myString = "this is a test";

と呼ばれる変数をmyString作成し、それにアドレス0x1000を割り当てます。次に、

myString = "this is a very very ... test";

0x1200を割り当てます。に

cout << myString << endl;

0x1200で始まる文字列を出力するだけです。

于 2011-11-15T20:37:34.160 に答える
2

プログラムの実行中に、「this is a test」を含むメモリ ブロックが割り当てられ、そのメモリ ブロックの最初の文字のアドレスが myString 変数に割り当てられます。次の行では、「this is a very very...」を含む別のメモリ ブロックが割り当てられ、そのメモリ ブロックの最初の文字のアドレスが myString 変数に割り当てられ、以前のアドレスが置き換えられます。新しいアドレスを「非常に長い」文字列に格納します。

説明のために、メモリの最初のブロックが次のようになっているとします。

[t][h][i][s][ ][i][s][ ][a][ ][t][e][s][t] この最初の 't ' このシーケンス/配列の文字は 0x100 です。そのため、myString 変数の最初の割り当ての後、myString 変数には「this is a test」の最初の文字を指すアドレス 0x100 が含まれます。

次に、まったく異なるメモリブロックに次のものが含まれます。

[t][h][i][s][ ][i][s][ ][a][ ][v][e][r][r][y]... では、この最初の「t」文字のアドレスは 0x200 です。そのため、myString 変数の 2 回目の代入の後、myString 変数には NOW のアドレス 0x200 が含まれます。これは、「これは非常に非常に非常に...」の最初の文字を指します。

myString は単なる文字へのポインタであるため (したがって、"char *" がその型です)、文字のアドレスのみを格納します。配列の大きさは気にせず、「配列」を指していることさえ知らず、文字のアドレスを格納しているだけです...

たとえば、合法的にこれを行うことができます。

    char myChar = 'C';
/* assign the address of the location in 
   memory in which 'C' is stored to 
   the myString variable. */
    myString = &myChar; 

うまくいけば、それは十分に明確でした。もしそうなら、賛成/回答を受け入れてください。そうでない場合は、明確にするためにコメントしてください。

于 2011-11-15T20:51:02.773 に答える