私はいくつかの基本に立ち往生しているようです。関数内の文字列へのポインタ
Test1: (null) Test2: 1234567890 Test3: 1234567890 Test4: 1234567890
Test1の機能の何が問題になってい:
#include <stdlib.h> void Test1(char *t) { t = (char *)malloc(11); strcpy(t, "1234567890"); } void Test2(char **t) { *t = (char *)malloc(11); strcpy(*t, "1234567890"); } void Test3(char *t) { strcpy(t, "1234567890"); } char * Test4(char *t) { t = (char *)malloc(11); strcpy(t, "1234567890"); return t; } int main() { char *t1 = NULL; Test1(t1); printf("\nTest1: %s\n", t1); char *t2 = NULL; Test2(&t2); printf("\nTest2: %s\n", t2); char *t3 = (char *)malloc(11); Test3(t3); printf("\nTest3: %s\n", t3); char *t4 = NULL; t4 = Test4(t4); printf("\nTest4: %s\n", t4); return 0; }
この出力を与える:次のコードは、なぜ誰かが私に説明できますか?そして、なぜTest1とほぼ同じTest4が動作するのでしょうか? より一般的な質問:関数内の文字列を作成し、ポインタを返す正しい方法は何ですか?
あなたがC++とCの両方をタグ付けしました、そして、これが依存あなたが使用しているC++では、 'std :: string'を使用するべきです(いくつかのキーを押す必要がない限り!)。Cでは、最初のアプローチ以外はすべて可能です。 – Nim
はい、私は文字列クラスを使うことができますが、コアを理解したいので、ここでchar *を使用しています。 – clumpter
Cでは、 'malloc()'の結果を* NOT *キャストします。推論のためにここを読んでください:http://stackoverflow.com/a/605858/1701799(基本的に 'void *'は自動的かつ安全に適切な型に昇格するからです)。私はこれがC/C++としてタグ付けされていることを知っていますが、そのような言語 "C/C++"はありません。これがC++の場合は、#include ではなく '#include'を使用します。 C++では 'malloc()'/'free()'を使うことはほとんどありませんが、代わりに 'new/delete'やそれ以上のスマートポインタなどを使うでしょう.. –
RastaJedi