2016-10-20 3 views
0

OK、文字列を返すために、以下の方法が正常に動作します:、Cで正しく文字列を返す複数回

char* SU(double V) { 
    static char Str[80]; 
    // Do something 
    return Str; 
} 
printf("%s", SU(A)); 

しかし、メモリ内の文字列のスペースがの終わりに同じであるので、以下は黙って失敗します。両方の呼び出し:

printf("%s %s", SU(A), SU(B)); 

どうすればいいですか?私はalloca()を見ていましたが、alloca()で割り当てられた文字列を返すことはできないと思いますか?

+0

可能な複製(http://stackoverflow.com/questions/31411831/proper-way-to-return-a- string-in-c) –

+0

コールサイトに2つのバッファを割り当ててSUに渡すのはなぜですか? – user694733

+0

関数はメモリを割り当て、この新たに割り当てられたメモリへのポインタを返すことができます。多くのプログラマーは、メモリを割り当てる関数を解放する関数を持つ方が安全な戦略だと考えているので、このアプローチが嫌いです。 –

答えて

2

連載SUへの呼び出し:

printf("%s ", SU(A)); 
printf("%s" , SU(B)); 

また、返された文字列をコピーします。

char *sua = strdup(SU(A)); 
char *sub = strdup(SU(B)); 
printf("%s %s", sua, sub); 
free(sua); 
free(sub); 
1
ではなく、ヒープ上の文字列を割り当てるために、あなたの関数を変更し

char* SU(double V) { 
    char* Str = malloc(80); 
    // Do something 
    return Str; 
} 

完了したら返された文字列を解放することを忘れないでください。

char* a = SU(A); 
char* b = SU(B); 
printf("%s %s", a, b); 
free(b); 
free(a); 
+0

はい、それはうまくいきますが、それは私が単純にしておきたい発信者のために複雑になります。 – dargaud

+0

@dargaud他の方法では、Str配列を関数に渡すことはあまり複雑ではありません。 –

+0

'static char * Str = malloc(80);'もコンパイルしますか?私はそのことを非常に疑っています...しかし、何とかしても、 'malloc'が一度だけ呼び出されると思います。その場合、' free'への2度目の呼び出しは未定義の動作をもたらすはずです。 –

3

常に発信者に割り当てることをお勧めします。 Cの関数から文字列を返すための標準的な方法は、パラメータを使用している:

void SU (double V, char* str, size_t size); 

それともあなたができる近代的なCで:

void SU (double V, size_t size, char str[static size]); 

See this

0

完全に有効なソリューションに加え、あなたが提案したのは、返された文字列をprintfに供給することだったので、この場合に適用できる別のアプローチについて考えました。これはGNU Cのregister_printf_function関数を使ってprintfにカスタム書式文字列を追加することです。

詳細情報hereと例[Cで文字列を返すために適切な方法]のhere for MAC addresses

関連する問題