2

char*関数内からいくつかの情報を受け取る as パラメータを持つ関数があります。( int foo(char* param1))

このパラメーターに、入力する必要があるすべての情報を受け取るのに十分なスペースが割り当てられていることを確認するにはどうすればよいですか? それが有効なポインターであるかどうかは確認できますが、パラメーターに割り当てられたサイズ/長さを確認する方法は見つかりませんでした。

関数を変更できません (サイズに別のパラメーターを追加できません)。

4

4 に答える 4

6

AFIAK、C++には、ポインターに割り当てられたスペースの量を確認する機能がありません。入力が NULL で終わる文字の配列 (つまり、c-string) を指している場合は、strlen() を使用できます。通常、C および C++ のこれらの種類の関数は、パラメーターから何が期待されるかについて十分に文書化する必要があります。関数は通常、呼び出し元が文書化された契約を尊重することを前提として実装されます。

于 2012-08-28T18:54:00.220 に答える
5

質問を正しく理解したとしても、ポインターに関連付けられている有効なメモリのサイズを確認する方法はありません。これがデータの配列を指している場合、サイズパラメータを渡す通常の方法ですが、そのオプションがない場合は、何にアクセスするのかわかりません

于 2012-08-28T18:52:58.060 に答える
4

簡単な答え:できません。

もう少し複雑なCスタイルの答え:そのcharの配列に終了NUL(0)バイトがある場合は、を使用できますstrlen()

OS固有の回答:アレイのメモリがを使用して取得された場合は、少なくともOSXとLinuxでそれぞれを使用malloc()できます。Windowsでは、Microsoft Cランタイムを使用するアプリケーション用に、関数があります。malloc_size()malloc_usable_size()_msize()

于 2012-08-28T18:58:46.767 に答える
1

確信が持てません。あまり。ポインタの有効性について実行できる唯一の実用的なチェックは、そうでないかどうかをチェックすることですNULL

バッファのサイズがparam1指している限り、頭に浮かぶのはこのばかげたハックだけです。param1関数を呼び出す前に、を指すバッファーの先頭にバッファーのサイズを入れてください。次に、データをバッファにコピーし、チェックが終了したらサイズを上書きします。

このような:

*(unsigned int*)param1 = buf_size;
foo(param1);

int foo(char* param1)
{  
    if (0 == param1)
    {
        // fail
    }

    unsigned int buf_size = *(unsigned int*)param1;

    if (buf_size < whateverlimit)
    {
        // fail
    }

    // copy data into the buffer
}

私はこのコードをコンパイルしていないので、いくつかの修正が必要になる可能性があります。

于 2012-08-28T19:12:45.767 に答える