2017-11-22 21 views
1

のは、私はCの関数があるとしましょう:のvoidポインタのバイト数

Func(void* param); 

はのparamコンテンツのバイト数を知る方法はありますか?

+0

移植不可能です。ポインター内のメモリーアドレスに加えて、 'size_t'長さを渡すと見えるそれらの標準ライブラリーとユーザー定義関数はすべて理由でそうしています。 *これに関連する*多くの*関連の質問の1つは[ここに** **見ることができます**](https://stackoverflow.com/questions/9390615/how-to-calculate-size-of-array-from-pointer-variable) 。 – WhozCraig

答えて

1

いいえparamが指しているものがわからないと、どのサイズか分かりません。

4

いいえ、できません。そのため、引数としてポインタをとる関数のほとんどすべてに、sizeの引数が追加されています。それはこのようにする必要があります:

void func(void *param, int size); 

はまた、size引数を解釈する機能次第であることに注意してください。これは、バイト数、要素数、または何でもかまいません。

ここで覚えておくべき重要なことは、唯一のものですparamは、メモリアドレスです。それ以上のものはありません。

一部の機能ではこれを使用しません。 1つの例は文字列をコピーするstrcpy(char * dest, char * src)ですが、この関数は2つのことを前提としています。 srcはゼロ終了文字列であると仮定します。 strcpy'\0'文字に当たるまでsrcから読み取ります。さらに、destは、文字列を保持するのに十分な大きさのメモリ位置を指しているものとします。

sizeof(*param)は機能しません。 paramは、メモリチャンクの開始位置のポインタにすぎません。 sizeof(void)

+0

@Hollyolあなたは 'void * 'を逆参照することはできません。あなたのOPを考えれば、 'param'はどんなタイプですか?私たちは知らないが、コンパイラはどちらも知らない。参照を外す前に、適切な型にキャストする必要があります。 – yano

+0

"特にポインタを無効にする場合は、あまりにも曖昧なことがあります。"と私は反対したい。バイトを除く 'void * 'が指し示すオブジェクトの大きさのための妥当な単位はありません。 – JeremyP

+0

@JeremyP確かに、私はそれを削除しました。 – klutt

2

まず、タイプvoidは、サイズが不定である不完全なタイプです。

C標準(6.2.5タイプ)

19からvoid型は、値の空のセットを含みます。完了できない不完全な オブジェクトタイプです。あなたが例えばとして

T *param 

を関数の引数としていくつかの他のタイプのポインタを持っている場合

しかしその後、一般的なケースでは、あなたは再び占めるバイト数を決定することができません参照された実際のデータ。

ポインターは、単一のオブジェクトまたは配列の最初のオブジェクトを指しているかどうかにかかわらず情報を保持しません。例えば

あなたは、それは、異なる種類の

char c = 'A'; 
f(&c); 

char s[] = "Hello"; 
f(s); 

のこれらのオブジェクトのために、たとえば呼び出すことができ、この

void f(const char *s); 

のような機能を宣言した場合もちろん、配列の要素または単一のオブジェクト参照によって占められているバイト数を取得できます表現

sizeof(*param) 

しかし、いくつかのコンパイラは、void型のためのオペレータsizeofを適用することができるように、独自の言語拡張を持っているのに、あなたもこれを実行しないことがありvoid *型の場合を使用して、例えばとしてポインタによってNCED。この場合、式の戻り値は通常1になります。

関連する問題