C関数を書き込む正しい方法は何ですか?charアレイを返しますか?

StackOverflow https://stackoverflow.com/questions/8311131

  •  25-10-2019
  •  | 
  •  

質問

私はJavaに精通しています、Cではそうではありません

Javaでは、何かを行い、文字列を返す方法がある場合、次のようになります。

private String doSomething(...) {
    String s;
    // do something;
    return s;
}

Cの構文等価物は機能せず、明らかに間違っています。

char* doSomething(...) {
    char s[100];
    // do something;
    return s;
}

もちろん私にできる:

char* doSomething(...) {
    char *s;
    s = malloc(100 * sizeof(char));
    // do something;
    return s;
}

どちらが機能しますか(私は思います!)しかし、私はこのようにコードが行うことはめったにありません(それは不必要にヒープを満たしているからですか?)

最も一般的には、

bool doSomething(char *s) {
    // do something that copies chars to s
    return true;
}

そして、呼び出しのステートメントは次のとおりです。

char s[100];
doSomething(s);

関数自体の内部までチャーアレイのサイズがわからない場合はどうなりますか?つまり、関数の外側のchar配列を宣言してから渡すことはできません。

何でしょうか 正しい そのようなシナリオに対処する方法は?

役に立ちましたか?

解決

静的割り当てケースの例(コンパイル時間の最大バッファサイズについて考える義務があります)

buf[MAX_NO];
do(buf, MAX_NO);

_Bool do(char *s, size_t len) { 
// use len as boundary in your operations
}

または動的割り当てケース(あなたが言ったようにmallocを使用し、ポインターを使用してバッファーの位置とサイズを保存します)

char *s = NULL;
size_t final_len;
do(&s, &final_len);

_Bool do(char** s, size_t* final_len) {
    size_t len = discoverSize();
    char* buf = (char*) malloc(sizeof(char) * len);

    *s = buf; //save memory location
    *final_len = len; //save buffer size
    // use len as boundary in your operations

}

// do whatever
free(s); //remember to free the buffer for politeness

他のヒント

呼び出しコードがメモリの割り当てに責任を負わせます。例2のバッファーとバッファの長さを渡します。

bool doSomething(char *s, size_t buflen)
{ 
    // do something that copies chars to s up to max of buflen
    return true; 
} 

通話コードはメモリ管理を制御しているため、これはリークを減らす傾向があります。

返された文字列の適切なサイズがわからない場合は、 malloc 解決。もちろん、あなたはしなければなりません free あなたがそれで終わった後、文字列。

Cで配列を返すことはできません。

あなたはaを返すことができます ポインター そして、あなたは(良いことを読むことによって学ぶべきです のプログラミングについて c 言語)アレイとポインターの違い。

一般的なイディオムは、動的に割り当てられたポインターを返すことです。次に、誰がポインターを解放するかを伝えるコンベンションが必要です。

配列を含む構造を返すこともできます。

補遺

Cでゴミコレクターを持ちたい場合は、試してみてください ボームのゴミコレクター

最も安全な方法は、他の人が言ったように、発信者に割り当てる責任を委ねることです。

ただし、リエントラントコードとJavaのシンプルさを必要としない場合、Cの構文作用に相当するものは次のとおりです。

char* doSomething(...) {
    static char s[100];
    // do something;
    return s;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top