答えて
いいえparam
が指しているものがわからないと、どのサイズか分かりません。
いいえ、できません。そのため、引数としてポインタをとる関数のほとんどすべてに、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)
まず、タイプ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になります。
- 1. voidポインタ関数の出力
- 2. void *ポインタのポインタ演算
- 3. 関数ポインタが互換性がないポインタ型void(my_type *)からvoid(*)(void *)
- 4. ステートフルC++グローバルvoid関数ポインタ
- 5. 変数をvoidポインタ、またはC++のvoidポインタ参照に送ります
- 6. const void *ポインタのctypes
- 7. クローンvoid *型のポインタ
- 8. cpp voidポインタのmake_shared
- 9. C++ポインタvoid関数の問題
- 10. void *とchar *ポインタの算術
- 11. C voidポインタの算術
- 12. void *ポインタの参照問題?
- 13. boost :: variantとvoid *ポインタ
- 14. voidポインタとffcallライブラリ
- 15. QBufferからvoidポインタとメモリサイズ
- 16. 特別なポインタ値((void *)1)
- 17. バイナリファイルへのvoidポインタの書き込み
- 18. LLVMへのvoidポインタの転送IRBuilder CreateCall
- 19. 構造体へのvoidポインタのキャスト
- 20. 配列へのvoidポインタの使用
- 21. サンプルコードのAVFoundation.Frameworkの静的voidポインタ
- 22. 任意の型ポインタへのvoidポインタのキャスト
- 23. GCC警告:void型のポインタ算術*
- 24. ポインタと整数( 'int'と 'void *')の比較 - C
- 25. C++型キャスト:voidポインタからクラスポインタへのポインタをキャスト
- 26. void関数のMockito - thenCallRealMethod()void
- 27. int型引数を取ってvoidを返す関数へのポインタの配列へのポインタ
- 28. char関数(void)とvoid関数(void)のCの差
- 29. 引数を受け取り、void関数へのポインタを返す関数
- 30. void *はオブジェクト型へのポインタではありません - voidからのキャストエラー**
移植不可能です。ポインター内のメモリーアドレスに加えて、 'size_t'長さを渡すと見えるそれらの標準ライブラリーとユーザー定義関数はすべて理由でそうしています。 *これに関連する*多くの*関連の質問の1つは[ここに** **見ることができます**](https://stackoverflow.com/questions/9390615/how-to-calculate-size-of-array-from-pointer-variable) 。 – WhozCraig