[解決済み] ポインタにメモリが割り当てられているかどうかのチェック
質問
C言語で、関数に渡されたポインタがメモリで確保されているかどうかを確認することは可能ですか?
C言語で、文字ポインタを受け取る独自の関数を書きました。 buf [バッファへのポインタ]とサイズ buf_siz [バッファサイズ]。実際には、この関数を呼び出す前に、バッファを作成し、それに buf_siz のメモリを割り当てる必要があります。
ユーザーがメモリ割り当てを忘れて、単に私の関数にポインタを渡す可能性があるので、私はこれをチェックしたいです。そこで、渡されたポインタが本当にbuf_sizの量のメモリに割り当てられたかどうかを私の関数で確認する方法はありますか...?
EDIT1です。 それをチェックするための標準的なライブラリはないようです...しかし、それをチェックするために何か汚いハックはありますか...?
EDIT2です。 私は私の関数は、良いCプログラマによって使用されることを知っている... しかし、私は我々がチェックすることができるかどうかを知りたい...我々はできる場合、私はそれに聞いてみたい....
結論です。つまり、関数内で特定のポインタがメモリに割り当てられているかどうかを確認することは不可能である
どうすれば解決するのか?
実装上の工夫を除いて、確認することはできません。
ポインターは、それが指す場所以外の情報を持っていません。できることは、「このコンパイラのバージョンがどのようにメモリを割り当てるか知っているので、メモリの参照を解除し、ポインタを 4 バイト後ろに移動し、サイズをチェックし、それが一致することを確認する..." といったことだけです。メモリ確保は実装定義なので、標準的なやり方ではできない。言うまでもなく、動的割り当てをまったく行っていないかもしれません。
私が思いつく唯一の非解決策は、自分でメモリを割り当ててそれを返すことですが、これは小さな変更とは言い難いです。(それはより大きな設計変更です)。
関連
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
[解決済み] 型付けされた関数ポインタ?
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
C++の配列コピー
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?