strcpyのようなにしようとしてポインタとプログラムがクラッシュ
質問
これは、ポインタが私の悪夢を与えている、今日は私の第二の課題です。 私はstrcpyの()関数が行うことと同じことを行うプログラムを作成しようとしています.. 私がしようとしたらit..itがクラッシュし、私はそれが私のコード内のポインタの問題だ100%確信しています。 unintiallizedポインタのいくつかの並べ替えがあるので私は思います(*コピー)..But私はそれに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);
}
事前に感謝します。
解決
mycpy
代わりのa[i]
をした可能性が)さて、あなた*(a+1)
はほとんど正しいです。正しくコピーされた文字列を印刷するために、最後の文字はゼロでなければならないが、最後の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];
他のヒント
あなたは、コピー操作の結果のためにいくつかのメモリを割り当てる必要があります。
あなたのケースではcopied
は初期化されていませんので、あなたはNULLポインタに書き込みをしようとしています。あなたはoriginal
にcopied
をコピーするために、以下では十分なメモリを割り当てます。
char* copied = new char[strlen(original)+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バイトを使用します。第二の例は、ヒープから15バイトを使用する。
固定ます:
#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
}
この行でます:
for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
これは、エラーが発生しb+i
の間接参照です。あなたは数1のポインタエラーです0
(NULL)を、逆参照しています。