2011-11-07 9 views
3

私はchar配列をコピーするポインタを使うことを学んでいます。ポインタを介してcharの配列を別の一時配列ポインタに転送する

私はC++で次のコードを持っています。私がやろうとしているのは、別のポインタ配列(temp)へのポインタを使って配列を渡すことです(set1)。

しかし、(temp)を印刷しようとすると、(set1)と同じではありません。

ポインタを介して別の一時配列ポインタに配列を転送します。

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    char set1[] = "ABC"; 

    char* p = &set1[0]; 

    int tempSize = 0; 
    char* temp = new char[256]; 

    for (int i = 0; i < 3; i++) 
    { 
     *temp = *p; 
     cout << *temp; // ABC 
     ++temp; 
     ++tempSize; 

     ++p; 
    } 

    cout << "\n"; 

    for (int i = 0; i < tempSize; i++) 
    { 
     cout << temp[i]; // Why ABC is not printed? 
    } 

    delete [] temp; 

    return 0; 
} 

答えて

5

// ABCが印刷されていないのはなぜ?あなたのポインタが未定義の動作に地域を走行しているので

その上で
char* temp = new char[256]; 
... 
++temp; // gone !! 

  1. あなたが最後に\0で文字列を終了していない(しない場合がありあなたのコードに必要です)
  2. delete[]最後にこの破損ポインタ。

あなたが目的を学ぶために書いているので、私はあなたのコードに簡単な修正を示唆している:

char* const temp = new char[256]; 
     ^^^^^ ensures `temp` is not modifiable 

は今目的を横断するためにtemp[i]を使用しています。

+0

ありがとう、私はこれを行うコードを更新しました。 for(int i = 0; i <3; i ++) { temp [i] = * p; ++ p; } – user1033627

0

ループをコピーすると、配列がtempに変更されるためです。ループの後、コピーされたデータを超えて1を指します。

また、割り当てられた新しい配列を終了することを忘れてしまいます。末尾に文字「'\0'」を追加する必要があります。

0

問題は、この行です:

++temp; 

あなたは、ポインタをインクリメントし、それに書き込みされています。最後にtemp[i];はあなたの文字列の始まりを指していませんが、最後に。

これを行う最も簡単な方法は、最初にforループを削除することです:

for (int i = 0; i < 3; i++) 
{ 
    temp[i] = set1[i]; 
} 
temp[4] = '\0'; // don't forget to close the string 
0

Cスタイルの文字列はNULL終端を持っている - 「ABC」は4つの文字が含まれています。また、私はtempのdelete呼び出しが有効であるとは確信していません。あなたは 'newed'だったので、それをインクリメントしています。

関連する問題