-1

私の問題は、このコードがあることです:

int size=4384;
char buffer[size];
codifyDHCPmessage(buffer, message, size);

ここで、message は char[] のみを含む構造体であり、関数は構造体のすべてのフィールドをバッファに返します。

バッファ配列を調べて、すべてのフィールドが正常であることを確認します。

しかし、私の問題は、そのバッファを次のように新しい関数に再度渡す場合です。

decodifyDHCPmessage(buffer,messageAux, size);

その関数で最初に行うことは、バッファーのサイズを確認することです。これは、4384 であると想定されているのに、4 であることを教えてくれるだけです...そして理由はわかりません。

私は C の専門家ではなく、ポインタとメモリ割り当ての問題は私にとって難しいと言わざるを得ません。

よろしくお願いします。

4

4 に答える 4

4

静的スタック配列は、引数として関数に渡されると、プレーンな古いポインターに「崩壊」します。次に何が起こるかはsizeof、配列ではなくポインターのサイズを取得することです。別の引数として配列サイズを渡す必要があります。

于 2012-04-13T10:00:52.613 に答える
3

配列が関数に渡されると、実際にはそのベースアドレスへのポインターが渡されます。これを適用sizeofすると、32 ビット システムのポインタのサイズである 4 だけが返されます。

の文字数が本当にbuffer必要な場合は、渡す前にnullで終了していることを確認してから、呼び出された関数でstrlenサイズを計算するなどの方法を使用するか、呼び出し元自体で配列サイズを計算する必要があります(配列が定義されており、sizeofそれで正常に動作します)、呼び出される関数に送信します。

すでに配列のサイズを引数として送信しています。しかし、配列内の実際の文字数を知りたい場合は、次のようにすることができます-

int size=4384;
char buffer[size];
memset(buffer, 0, size);

そして、あなたのcodifyDHCPmessage.Finalを呼び出しdecodifyDHCPmessageます。

unsigned sz = strlen(buffer);
于 2012-04-13T10:01:21.127 に答える
2

関数の署名は次のようになっていると思います。

void codifyDHCPmessage(char[], message_t, size_t);

(または類似)

問題は[]、関数のシグネチャが本当に を意味する*ことです。つまり、char[]実際にはchar*です。つまり、配列引数は、当然のことながらサイズが 4 のポインターに減衰します。

私の知る限り (間違っているかもしれませんが…)、C では配列を関数に渡すことはまったく許可されておらず、ポインターのみをサポートしています。そのため、明示的な別の引数としてサイズを渡す必要があります。

于 2012-04-13T10:01:03.787 に答える
0

C/C++ では、バッファ引数はポインタとして関数に渡されます==> ポインタのサイズをバイト - 4 で返します。

于 2012-04-13T10:02:42.060 に答える