2

これが私のコードです...

char* m1;
char* m2 = "sth";
strcpy(m1, m2);

そのコードは実行時エラーをスローしたので、試してみました...

char m1[];
char m2[] = "sth"; 

エラーなしで実行できます。でも、使いたい…

char* s

私は何をするつもりですか?

4

5 に答える 5

2

allocateのメモリを使用する必要がありますm1。例えば

char* m1 = new char[4];
char* m2 = "sth";
strcpy(m1, m2);
// so smth with m1
delete[] m1;

しかし、C++ で書いているのに、なぜ使用しないのstd::stringですか?

于 2012-09-17T08:55:55.067 に答える
1

問題は、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 は静的に割り当てられ、解放する必要はありません。

于 2012-09-17T08:56:51.893 に答える
1

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();

問題はなくなりました。

さらに、バッファ サイズと適切な割り当て解除を気にする必要がなくなりました。

于 2012-09-17T10:02:40.897 に答える
0

あなたの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はまだ配列とポインターを理解していないと思います。それについてさらに読んで考えてみてください。

于 2012-09-17T09:23:36.853 に答える
-2

まず、コピーを実行する前に、宛先ポインターにコピーを保持するのに十分なメモリがあることを確認する必要があります。そうしないと、実行時エラーが発生します。したがって、これが必要です:

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::beginstd::end

std::string m1("");
std::string m2("sth");
std::copy(std::begin(m2), std::end(m2), std::begin(m1));

m2編集:コンパイル時に長さを推測できるように、静的に予約されている限り機能します。

于 2012-09-17T09:07:57.677 に答える