1

Linux で libc の strerror_r 関数を使用しています。バッファー ポインターとバッファー サイズの引数に 0 を指定して呼び出すと、エラー メッセージと共に文字列へのポインターが返されます。

後で使用するために文字列のコピーを作成しますが、返されたポインターをどうするか? このポインターを何らかの方法で解放する必要がありますか?それとも静的メッセージ テーブルを指していますか?

4

1 に答える 1

2

の (GNU、非 Posix) バージョンによって返される文字列は、strerror_r常に静的文字列か、指定したバッファのいずれかです。ほとんどの場合、静的文字列になります。errnoエラー文字列は、 の値が不明な場合にのみ動的に作成されます。

バッファ サイズに 0 を指定すると、バッファは使用されません。必要な場合は引き続き返されます。つまり、あなたの場合、呼び出しの結果として 0 を受け取る可能性があることを意味しますstrerror_r。それはおそらくあなたが意図したものではありません。

の Posix バージョンはstrerror_r 常に指定したバッファを使用し、何らかのエラーが発生しない限り 0 を返します (バッファが不足するとエラーになるため、Posix バージョンでバッファを 0 に指定すると、エラーが返されることが保証されます。これは -- 副作用として -- の以前の値を破壊しますerrno

要するに:

  1. バッファー長 0 での呼び出しstrerror_rは正しくありませんが、その関数の Gnu 固有のバージョンを使用する場合、ほとんどの場合問題になりません。

  2. バッファでない限り、文字列をコピーする必要はありません。strerror_r の Posix 互換バージョンでは、静的文字列が使用可能かどうかを知ることができないため、常にバッファーをコピーすることになります。

于 2013-10-28T19:28:28.280 に答える