これが私のコードです...
char* m1;
char* m2 = "sth";
strcpy(m1, m2);
そのコードは実行時エラーをスローしたので、試してみました...
char m1[];
char m2[] = "sth";
エラーなしで実行できます。でも、使いたい…
char* s
私は何をするつもりですか?
これが私のコードです...
char* m1;
char* m2 = "sth";
strcpy(m1, m2);
そのコードは実行時エラーをスローしたので、試してみました...
char m1[];
char m2[] = "sth";
エラーなしで実行できます。でも、使いたい…
char* s
私は何をするつもりですか?
allocate
のメモリを使用する必要がありますm1
。例えば
char* m1 = new char[4];
char* m2 = "sth";
strcpy(m1, m2);
// so smth with m1
delete[] m1;
しかし、C++ で書いているのに、なぜ使用しないのstd::string
ですか?
問題は、strcpy メソッドの結果を格納するためのメモリを割り当てていないことです。必要なもの:
char* m1 = (char *) malloc(sizeof(char) * 4) /* 4 being the size of 3 chars + trailing \0 */
char* m2 = "sth";
strcpyを実行できるよりも
そして最後に、動的に割り当てられたメモリ ag を解放する必要があります。
free(m1)
m2 は静的に割り当てられ、解放する必要はありません。
C++ では、次のようにします。
// don't forget to #include <string>
std::string m1;
std::string m2 = "sth";
m1 = m2;
その後、必要な場合const char*
(たとえば、API 呼び出し用) を取得できます。
const char* str = m1.c_str();
問題はなくなりました。
さらに、バッファ サイズと適切な割り当て解除を気にする必要がなくなりました。
あなたの2番目の例でも無効だと思います
char m1[];
char m2[] = "sth";
m1 には、コピーされたデータを格納するための有効なメモリがありません。そして、宣言に配列次元を含める必要があると思います(ここではメソッドパラメーターを宣言していません)
通常、次のようなものが必要です
char m1[10];
char m2[] = "sth";
strcpy(m1, m2);
質問に戻ります。多くの人が、char* を使用するにはメモリを割り当てる必要があると言いました。間違いではありませんが、より正確には、ポインタが有効なメモリを指している必要があります。
メモリの割り当ては 1 つの方法ですが、次のようなこともできます。
char outdata[100];
char* m1 = &(outdata[10]);
char* m2 = "foo";
strcpy(m1, m2);
ここでは明示的な割り当てはありませんが、それでも有効な例です。
OPはまだ配列とポインターを理解していないと思います。それについてさらに読んで考えてみてください。
まず、コピーを実行する前に、宛先ポインターにコピーを保持するのに十分なメモリがあることを確認する必要があります。そうしないと、実行時エラーが発生します。したがって、これが必要です:
char* m1;
char* m2 = "sth";
m1 = new char[strlen(m2)+1]; // <---- reserve memory for m1
strcpy(m1, m2);
// remember to delete[] m1
文字列を扱うもう 1 つの方法は、std::string
代わりにクラスを使用することです。そうすれば、メモリ管理が煩わされることはありません。
std::string m1("");
std::string m2("sth");
m1 = m2; // no strcopy needed, no memory management needed
最後に、何らかの理由でポインターを処理する必要がある場合は、new/delete のペアに注意し、new[] で予約されたメモリを delete[] で削除する必要があることを思い出してください。
そして、追加のアドバイス:代わりにmemcpy
、の使用を好みますstd::copy
:
char* m1;
char* m2 = "sth";
m1 = new char[strlen(m2)+1]; // <---- reserve memory for m1
std::copy(std::begin(m2), std::end(m2), std::begin(m1));
// remember to delete[] m1
and関数を使用するとchar *
、 とstd::string
バージョンの両方で機能するため:std::begin
std::end
std::string m1("");
std::string m2("sth");
std::copy(std::begin(m2), std::end(m2), std::begin(m1));
m2
編集:コンパイル時に長さを推測できるように、静的に予約されている限り機能します。