web-dev-qa-db-ja.com

関数からchar配列を返すにはどうすればよいですか?

私は次を試しました:

char[10] testfunc()
{
    char[10] str;

    return str;
}
26
Datoxalas

出力パラメーターとして最適:

void testfunc(char* outStr){
  char str[10];
  for(int i=0; i < 10; ++i){
    outStr[i] = str[i];
  }
}

と呼ばれる

int main(){
  char myStr[10];
  testfunc(myStr);
  // myStr is now filled
}
43
Xeo

_char[10]_は_char*_と同じであることを理解する必要があります。実際、ポインタを返しています。これで、ポインターは変数(str)をポイントします。変数は関数を終了するとすぐに破棄されるため、ポインターは...何もポイントしません!

通常、Cでは、この場合、明示的にメモリを割り当てます。これは、関数が終了しても破棄されません。

_char* testfunc()
{
    char* str = malloc(10 * sizeof(char));
    return str;
}
_

ただし注意してください! strが指すメモリは、決して破壊されることはありません。これは「メモリリーク」として知られています。 free()を完了したら、必ずメモリを確認してください。

_foo = testfunc();
// do something with your foo
free(foo); 
_
15

C++を使用している場合、std::stringを使用できます。

12
Flinsch

char *配列はchar *によって返されますが、関数が終了すると消える自動変数を返すため、作成した関数は機能しません。次のようなものを使用します。

char *testfunc() {
    char* arr = malloc(100);
    strcpy(arr,"xxxx");
    return arr;
}

もちろん、これはstd ::やboost ::などではなく、Cの意味で配列を返す場合です。コメントセクションに記載されているように、呼び出し元からメモリを解放することを忘れないでください。

7
Felice Pollano

ブーストあり:

boost::array<char, 10> testfunc()
{
    boost::array<char, 10> str;

    return str;
}

通常のchar[10](または他の配列)を関数から返すことはできません。

4
MSalters

スタックで作成された関数内にローカル変数を作成すると、関数を終了するときにメモリで上書きされる可能性が高くなります。そのため、ほとんどのc ++実装でこのようなコードは機能しません。

char[] pupulateChar()
{
    char* ch = "wonet return me";
    return ch;
}

修正方法は、関数の外部またはデータを使用する場所に入力する変数を作成し、それをパラメーターとして渡し、関数を操作することです。例:

void populateChar(char* ch){
    strcpy(ch,"fill me will, this will stay",size); // this will work as long it won overflow it. 
}
int main(){
    char ch[100]; // reserve memory in stack outside the function
    populateChar(ch); //populate array
}

std :: move(ch)を使用して左辺値を右辺値にキャストするc ++ 11ソリューション

void populateChar(char* && fillme){
    fillme = new char[20];
    strcpy(fillme, "this worked for me");
}
int main(){
    char* ch;
    populateChar(std::move(ch));
    return 0;
}

またはc ++ 11のこのオプション:

char* populateChar(){
    char* ch = "test char";
    // will change from lvalue to r value
    return std::move(ch);
}
int main(){
    char* ch = populateChar();
    return 0;
}
0
devcodexyz