Cでコーディングするのはかなり新しく、現在、Cの文字列/文字配列を返し、変数に割り当てる関数を作成しようとしています。
これまでのところ、iveはchar *を返すことが最も一般的な解決策であることを観察しました。だから私は試しました:
_char* createStr() {
char char1= 'm';
char char2= 'y';
char str[3];
str[0] = char1;
str[1] = char2;
str[2] = '\0';
char* cp = str;
return cp;
}
_
私の質問は、返されたこの_char*
_をどのように使用し、それが指すchar配列をchar []変数にどのように割り当てるかです。
私が試した(すべてnoob-drowningエラーにつながった):
char* charP = createStr();
char myStr[3] = &createStr();
char* charP = *createStr();
変数を動的に割り当てていないことに注意してください。これは、関数内のstr
内のデータが関数の終わりまでに失われることを意味します。
次のものが必要です。
char * createStr() {
char char1= 'm';
char char2= 'y';
char *str = (char *) malloc(sizeof(char) * 3);
str[0] = char1;
str[1] = char2;
str[2] = '\0';
return str;
}
次に、関数を呼び出すときに、データを受け取る変数の型が関数の戻り値の型と一致する必要があります。したがって、次のものが必要です。
char *returned_str = createStr();
関数から_char*
_を返したい場合は、必ずmalloc()
してください。スタックで初期化された文字配列は、その関数から戻った後にそれらにアクセスすることは未定義の動作なので、戻ることには意味がありません。
に変更する
_char* createStr() {
char char1= 'm';
char char2= 'y';
char *str = malloc(3 * sizeof(char));
if(str == NULL) return NULL;
str[0] = char1;
str[1] = char2;
str[2] = '\0';
return str;
}
_
char* charP = createStr();
関数が正しければ正しいでしょう。残念ながら、関数内のローカル変数へのポインターを返しています。つまり、関数が戻るとすぐに未定義データへのポインターになります。返すポインターに意味を持たせるには、関数の文字列にmallocなどのヒープ割り当てを使用する必要があります。その後、後でそれを解放することを忘れないでください。
「string.h」を含めると、作業が簡単になります。問題に取り組む簡単な方法は次のとおりです。
#include <string.h>
char* createStr(){
static char str[20] = "my";
return str;
}
int main(){
char a[20];
strcpy(a,createStr()); //this will copy the returned value of createStr() into a[]
printf("%s",a);
return 0;
}
メソッドで静的配列を使用して、関数の終了時に配列が失われないようにすることができます。
char * createStr() {
char char1= 'm';
char char2= 'y';
static char str[3];
str[0] = char1;
str[1] = char2;
str[2] = '\0';
return str;
}