0
#include<string.h>
#include<stdio.h>

int main()
{ 
  char* charPtr="see me";
  printf("%s\n", charPtr);
  printf("%d", charPtr);
  return 0;
}

次の行がわかりません:char * charPtr = "see me";

メモリはどのように割り当てられますか?

7バイトのメモリが割り当てられ、ポインタが最初のバイトに割り当てられていますか?と

sizeof(char *)が4バイトであることを知っていますが、ここではどのように重要であり、メモリの割り当てにどのように影響しますか?

誰か助けてください。ありがとう...

4

6 に答える 6

6

charPtr実装定義のメモリ領域のどこかにある文字列リテラル「seeme」のポインタです。この文字列リテラルは変更しないでください。変更しようとすると、未定義の動作が残ります。

sizeof(char*)4バイトが何であるかを知っています、そしてそれはここでどのように重要であり、それはメモリの割り当てにどのように影響しますか?

はポインタなので、文字列リテラルの長さを決定するためにcharPtr使用することはできません。sizeof()そうすると、文字列ではなく、ポインタが占めるメモリが得られます。strlen()文字列の長さを取得する必要がある場合は、を使用する必要があります。

         +-----+     +---+---+---+---+---+---+----
charPtr: |  *======> | s | e | e |   | m | e |\0 |
         +-----+     +---+---+---+---+---+---+---- 
于 2012-09-05T10:47:26.237 に答える
3

文字列リテラルは、プログラムの起動時に使用できるように、メモリの「どこかに」配置されます。

変数charPtrは(通常はスタック上で)割り当てられ、通常は32ビットプラットフォームでは32ビット、64ビットプラットフォームでは64ビットを使用します。あなたの場合、sizeof (char *) is 4, the pointer will need4 * CHAR_BIT`ビットと述べているので、これはバイトアドレス可能なメモリを備えたほとんどすべての最新のコンピュータでは32ビットです。

ポインタは、文字列の最初のバイトを指すように初期化されます。

于 2012-09-05T10:47:01.167 に答える
2

7バイトのメモリが割り当てられ、ポインタが最初のバイトに割り当てられていますか?

実際、そうではありません。メモリの読み取り専用部分のどこかに、を含む7つの文字が割り当てられ"see me\0"、この変数はそれを指します。

違いは、あなたが書くなら

char charPtr[]="see me";

この場合、スタックには7char(+いくつかのパディング)の長い配列が割り当てられ、「seeme」というテキストがコピーされます。

メモリはどのように割り当てられますか?

アプリケーションの起動時にOSによって割り当てられます。

于 2012-09-05T10:47:23.537 に答える
2

これ"see me"は文字列リテラルであり、プログラムの存続期間中存在します。文字列リテラルのメモリはスタックに割り当てられず、メモリはヒープに割り当てられません。文字列リテラルは、読み取り専用領域のバイナリにコンパイルされます。

文字列リテラルには8文字があり"see me"ます。表示される7文字と、暗黙のnullターミネータです。

初期化:

char* charPtr="see me";

charPtr文字列リテラルのアドレスを示します。文字列リテラルの変更は未定義の動作です。

詳細については、セクション6.4.5C99標準の文字列リテラルを参照してください。


ご了承ください:

printf("%d", charPtr);

引数を%d期待するように技術的に未定義の動作ですが、代わりに:を使用してください。intcharPtrchar*%p

于 2012-09-05T10:48:17.533 に答える
1

通常、ステートメントはconstポインターを使用します。

const char* charPtr = "see me";

「seeme」は読み取り専用メモリに割り当てられます。charPtr's'のアドレスが含まれています。文字列はnull文字で終了します。

于 2012-09-05T10:49:45.650 に答える
0

char*文字列の最初のインデックスを指す通常のポインタと同じです。

于 2012-09-05T11:01:18.690 に答える