1

私はポインターを理解するために自分の道を進んでいます。この文字列コピー機能をCで記述しました。

#include<stdio.h>

char *my_strcpy(char *dest, char *source)
{
   while (*source != '\0')
   {
     *dest++ = *source++;
   }
   *dest = '\0';
 return dest;
}

int main(void)
{
  char* temp="temp";
  char* temp1=NULL;
  my_strcpy(temp1,temp);
  puts(temp1);



  return 0;

}

このプログラムはセグメンテーション違反を起こします。それでも変更char* temp1=NULLすると失敗します。char* temp1に変更char* temp1するchar temp1[80]と、コードは機能します。このコードchar temp1[1]は、出力をtempとして提供する場合にも機能します。出力はtにすべきだと思っていました。なぜこのようになり、なぜエラーが発生するのですかchar* temp

4

2 に答える 2

5

宛先文字列にスペースを割り当てていないためです。ある位置でメモリに書き込もうとしていますNULL(ほぼ確実に0x00)。

試してみてくださいchar* temp1= malloc(strlen(temp)+1);。それはいくらかのメモリを割り当て、それからあなたはそれに文字をコピーすることができます。+1は、末尾のヌル文字用です。

Javaやその仲間を書いた場合、配列の最後からメモリにアクセスできなくなります。しかし、言語レベルでは、Cを使用すると任意の場所にメモリに書き込むことができます。そしてクラッシュします(うまくいけばすぐに、しかし多分来週)。配列は厳密に強制されるデータ型ではなく、メモリを割り当てて参照するための単なる規則です。

そのように作成するとchar temp1[1]、スタックにメモリが割り当てられます。その近くのメモリはアクセス可能かもしれませんが(あなたはそれに読み書きすることができます)、あなたは何か他のもののために意図された他のメモリの上に走り書きするでしょう。これは典型的なメモリのバグです。

また、スタイル:私は個人的にsからの戻り値を使用しないことをお勧めします++。読みにくく、考え直します。

*dest = *source;
dest++;
source++;

より明確です。しかし、それは私の意見です。

于 2012-10-08T17:27:31.807 に答える
0

宛先パラメータにスペースを割り当てる必要があります。

を使用する場合char temp1[80]は、メモリに80バイトを割り当てます。

配列などの静的な方法でメモリを割り当てるか、malloc関数を使用できます

于 2012-10-08T17:30:29.343 に答える