0
gcc 4.7.2
c89

こんにちは、

関数 GetCallRef(...) は、この 3 番目のパラメーターのバッファーへのポインターを想定しています。つまり、call_id は私のポインターです。ただし、call_id で返される文字列の長さはわかりません。この call_id はこの関数でのみ使用されるため、ローカル スコープしか持たないため、関数で返された call_id のみを使用します。

私の質問は次のとおりです。ポインタを宣言してそれを渡しても大丈夫ですか。

char *call_id = NULL;

または、非常に大きなサイズの配列を宣言する方が良いでしょう(大きなサイズが十分に大きいかどうかわからないため)

char call_id[1024]

実際の機能。

if(GetCallRef(crn, GET_CALLID, call_id) == 0) {
    /* use the call id - not used outside of this function */
}

GetCallRef(...)クローズされているため、実際の関数のソース コードはありません。

関数が内部的にそのバッファーに直接コピーされる可能性があるため、バッファーの方が優れていると思います。ただし、配列は関数の引数のポインターに分解され、この関数シグネチャの一部ではないため、サイズを渡していないため、長さはわずか 4 バイトになります。関数は配列の大きさをどのように認識しますか? できない。

ポインターを渡すと、文字列値が格納されているアドレスを割り当てることができます。つまり、それを返します。

call_id = call_reference_id;

すべてのドキュメントは、バッファーが呼び出し ID を格納するのに十分な大きさであるべきだと述べていますが、どのくらいの大きさであるべきかについては述べていません。

アドバイスありがとうございました。

4

2 に答える 2

2

ドキュメントに「バッファは呼び出し ID を格納するのに十分な大きさでなければならない」と記載されている場合、関数は呼び出し元がスタックまたはヒープ上に事前に割り当てられたバッファを渡すことを期待していることを意味します。

重要な Q は、渡されたバッファーにどれだけのメモリを割り当てる必要があるかです。

関数のドキュメントには、これについて言及する必要があります。
関数がこの情報を通知しない限り、100% 安全になる方法はありません。
おそらく、同様のパラメータを取る他のAPIを確認するか、これを文書化した機能仕様を確認する必要があります。

すべてが失敗した場合の最後のオプションは、おそらく十分なサイズの配列を割り当てて1024、コードを厳密にテストすることです。

于 2013-01-16T05:15:58.790 に答える
0

この場合、必ず配列を渡す必要があります。関数がバッファを必要としているとドキュメントに記載されている場合、ポインタを渡すだけでセグメンテーション違反が発生する可能性があります。「十分な大きさ」がどれくらい大きいかを示していない場合、それは不十分なドキュメントです。文字列の種類がわかっている場合call_idは、作成する適切なサイズのバッファーを推測できます。そうでない場合、関数をテストして、どのような値が返されるかを確認できますか? それは、作業するのに十分なアイデアを与えるかもしれません。

十分なスペースのある配列を使用してみてください(あなたが提案するような1024のサイズは良い出発点のようです)、それが.として返すものを見てくださいcall_id. これを何度も行います。たとえば、常に 64 文字の文字列であることがわかる場合があります。この場合、少なくとも 64 個の要素を持つ配列を渡すだけで問題ありません。

于 2013-01-16T05:16:15.603 に答える