0
char * p_one = "this is  my first char pointer";
char * p_two= "this is second";
strcpy(p_one ,p_two);

上記のコードを検討してください。これにより、アクセス違反エラーが発生します。だから理解するのを手伝ってください

  1. 現在の"this is my first char pointer"文字列はメモリのどこに保存されていますか?ヒープまたはスタック
  2. strcpy最初の文字列がすでに格納されている場合でも、呼び出す前にp_oneにメモリを割り当てる必要があるのはなぜですか。"this is second"文字列を同じ場所にコピーできないのはなぜですか?
  3. 呼び出す前にp_oneにメモリを割り当てると、p_oneが指す文字列はstrcpyどう"this is my first char pointer"なりますか?それはメモリに保持されますか?
  4. 特定のポインタがメモリを割り当てたかどうかをどのようstrcpyに知るのですか?
4

4 に答える 4

7
  1. 実装定義の(通常は読み取り専用)メモリ。[参照1]
  2. ソース文字列リテラルを変更しない限り、変更する必要はありません。
  3. にメモリを割り当てるp_oneと、新しく割り当てられたメモリ領域を指します。文字列リテラルはメモリに残っている場合と残っていない場合がありますが、プログラムの存続期間中は存続することが保証されます。文字列リテラルの存続期間は静的です。[参照2]
  4. そうではありません。それを確実にするのはユーザーの責任です。

良い読み物:
[参照1] char a [] =?string ?;の違いは何ですか?およびchar*p =?string?;?
[参照2] Cでの文字列リテラルの「存続期間」

于 2012-09-18T03:56:55.940 に答える
1

最初に、コンパイラは p_one と p_two がconst char *コンパイル時にこの文字列のストレージを割り当てるため、実際には p_one と p_two であることを警告する必要があります。

それらを変更できない理由は、理論的にはそれらの後にメモリを上書きできるためです。これがスタックオーバーフローによるハック攻撃の原因です。

また、コンパイラはスマートで、この文字列を 10 か所で使用しているが、それが同じであることに気付く可能性があるため、1 か所から変更すると変更されますが、それを使用する他の 9 か所のロジックが破壊されます。

于 2012-09-18T04:00:43.643 に答える
1

すべての質問に順番に答える

  1. char ポインターが常にスタックに格納されるのは、少し単純明快です。メモリ割り当てを使用していても、これは文字列の長さを決定し、'\0' 文字を追加するためだけのものであることを忘れないでください。

あなたが言及したコードによると、これは1つの解決策です:

int main()
{
   char * p_one = "this is  my first char pointer";
   char * p_two= "this is second";
   size_t keylen=strlen(p_two);
   p_one=(char *)malloc(keylen*sizeof(char));
   strncpy(p_one ,p_two,strlen(p_one));
   printf("%s",p_one);

   return 0;
}
  1. char ポインターを宣言した場合、それはメモリ割り当てのみを指します。したがって、文字列のコピーは文字の終わりを指しません。したがって、この状況では常に strncpy を使用することをお勧めします。

  2. はい、メモリを割り当てています。

  3. 実行時エラーがスローされる可能性を抑制するため、malloc の結果をキャストするのは悪い習慣です。Gewure に感謝します。
于 2016-05-24T04:53:32.850 に答える
0

コードにそのような文字列リテラルがある場合、それを一時的な定数値と考える必要があります。確かに、それを に割り当てましたchar*が、それは変更が許可されているという意味ではありません。C 仕様には、これが合法であるとは書かれていません。

一方、これは大丈夫です:

const size_t MAX_STR = 50;
char p_one[MAX_STR] = "this is  my first char pointer";
const char *p_two = "this is second";
strcpy( p_one, p_two );
于 2012-09-18T04:03:28.803 に答える