1

これは今日の私の2番目の問題であり、ポインターは私に悪夢を与えています。strcpy()関数と同じことを行うプログラムを作成しようとしています。一度試してみると、クラッシュして、コード内のポインターの問題であると100%確信しています。ある種の初期化されていないポインタ(*コピー)があるので..しかし、私はそれにNULLを割り当てました...それで、Null割り当てが正確に何のためにあるのか誰かに教えてもらえますか?私はその使用法を誤解していると思うので。そして、正常に実行するためにプログラムにどのような修正を加えることができるか教えてください。

 #include <iostream>
 using namespace std;

 void mycpy(char *b , char *a);

 int main()
 {

    char *original = "this is a text" ;
    char *copied = 0 ;

    mycpy(copied , original);

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;

    return 0;
}

void mycpy(char *b , char *a){

    for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

}

前もって感謝します 。

4

5 に答える 5

4

まあ、あなたはほぼ正しいです(算術の代わりに、つまりの代わりにmycpy角かっこを使用することもできますが)。コピーされた文字列を正しく出力するには、最後の文字がゼロである必要がありますが、最後の文字は関数によってコピーされません。だからそれはむしろのようにすべきですa[i]*(a+1)

void mycpy(char *b , char *a)
{
    int i;
    for(i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
    *(b+i) = 0; // or "\0", doesn't matter    
}

さらに、変数

char *copied = 0 ;

は有効なメモリを指していないため、メモリ位置0から読み取っています。これは不正です。変数を配列として定義できます

char copied[20];
于 2010-02-12T19:51:18.187 に答える
3

コピー操作の結果のために、いくらかのメモリを割り当てる必要があります。

あなたの場合copiedは初期化されていないので、nullポインタに書き込もうとしています。original以下は、コピーするのに十分なメモリを割り当てますcopied

char* copied = new char[strlen(original)+1];
于 2010-02-12T19:50:01.137 に答える
1

ポインタはありますが、メモリを指していません。これを機能させるには、メモリを割り当てる必要があります。

char *original;

これは、char型のメモリへのポインタにすぎません。これは単なるポインタであるため、「これはテキストです」に設定することはできません。「これはテキストです」を保存するスペースがありません。

char original[ 15 ] = "this is a text";
char copied[ 15 ] = "this is a text";

動作します、または

char *original;
char * copied;

original = malloc( 15 );
copied = malloc( 15 );

mycpy( original, "this is a text" );
mycpy( copied, original );

これらのメソッドは両方とも、テキストを格納するために15バイトを取得します。最初の例では、スタックから15バイトを使用します。2番目の例では、ヒープから15バイトを使用します。

于 2010-02-12T19:49:31.733 に答える
1

修理済み:

 #include <iostream>
 using namespace std;

 void mycpy(char *b , char *a);

 int main()
 {

    char *original = "this is a text" ;
    char copied[30]; // you need to actualy allocate space 
    // (this is on stack, you could use new as well, for heap allocation)

    mycpy(copied , original);

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;

    return 0;
}

void mycpy(char *b , char *a){
    int i =0;
    while (*(a+i)) {
        *(b+i) = *(a+i);
        ++i;
    }
    *(b+i) = '\0'; // null termination
}
于 2010-02-12T19:59:38.737 に答える
0

この行で:

for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

b+iエラーの原因となるのは逆参照です。逆参照0(NULL)します。これは、1番目のポインターエラーです。

于 2010-02-12T19:53:45.533 に答える