問題タブ [void-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2642 参照

objective-c - stringWithCString なしで void* を NSString* にキャストする

キーチェーンとやり取りするプログラムがあります。void ポインターへのポインターを渡すと、キーチェーンがそれをパスワードに指示します。UInt32 ポインターも渡すと、パスワードの長さを指します。

次に、これを NSString として使用する必要があります。そのように直接キャストしようとしましたが、必要以上のビットを集約していたため、パスワードでは機能しません。私は使用しようとしました:

これにより、パスワードが中国語のような文字に変更されました。理由がわからない。デバッグモードで説明を印刷すると、次のようになります。

私はそれを完全に動作させることができました:

しかし、これは減価償却されたので、使用したくありません。私は C と Objective-C の両方に非常に慣れていないため、void ポインターによってループが発生します。デバッグ モードで、ポインターが指しているメモリを調べたところ、間違いなくそのメモリ位置にあります。const char* を使用してみましたが、変数が初期化されていない可能性があると言って気に入らなかったのです。

キーチェーンにアクセスするために使用している方法は次のとおりです

NSString が正しい長さでそこを指すようにし、それを正しいものにする方法はありますか。助けてくれてありがとう。この場所は素晴らしいです!

0 投票する
4 に答える
2124 参照

c - C の質問: void** 二重間接参照ポインターでの単一逆参照

私はこのメッセージを受け取りました:

これに似たものをコンパイルしようとしたとき:



スタックオーバーフローに関するこの質問を読んだ後、解決策だと思うものを見つけました:
二重間接参照を扱うときの互換性のないポインター警告を回避する - スタックオーバーフロー

だから私はこのようなものに調整しました:

これは合法的な C ですか? 私は void ポインターを逆参照していますね。

みんなありがとう


2010 年 12 月 10 日 4:45PM EST 編集:
指摘されているようfree(NULL)に安全であり、C 標準でカバーされています。また、以下で説明するように、上記の私の例は合法的な C ではありません。caf の回答、Zack の回答、および私自身の回答を参照してください。

したがって、malloc されるポインターを NULL として初期化してから、コード内で free() と NULL を直接出力する方が簡単です。

私が行ったように myfree() で NULL をチェックしていた理由は、fclose() の経験によるものでした。fclose(NULL)プラットフォームによってはセグメンテーション違反が発生する可能性があるため (例: xpsp3 msvcrt.dll 7.0.2600.5512)、同じことが free() でも発生する可能性があると (誤って) 想定していました。関数でより適切に実装できるifステートメントでコードを乱雑にするのではなく、考えました。

皆様、良い議論をありがとうございました

0 投票する
5 に答える
1201 参照

c - オーバーロードの代わりにCでvoid*を使用しますか?

ここでの私の質問は、マルチスレッドアプリケーションで次のようなコードを見たことがあるということです。

これは非常に興味をそそられmallocました。voidポインターが返され、必要なものにキャストできることを知っていました。これは、任意のデータ型を受け入れることができる関数を作成できることを意味しますか?

たとえば、テストせずに作成した関数:

私は完全に間違っているかもしれませんが、これがうまくいくとしても、それは恐ろしい練習ですか?ありがとう。

0 投票する
3 に答える
1553 参照

c++ - Int を void* として渡し、値を取得する

コールバックに渡すオプションの引数として void* を取る Timer クラスを使用しています。整数を渡す必要がありますが、ロジックがうまく機能していないようです。

Event_PlayerSpawn() には、int「クライアント」のメモリ位置を指している int* clientIndex があります。これを void* パラメータに渡し、コールバックで再び int* にキャストし、逆参照して値を取得します。正確にどこが間違っているのですか?

0 投票する
4 に答える
3797 参照

c - ビットフィールドからポインタにどのようにキャストしますか?

私は次のコードを作成しました。

警告:初期化により、キャストなしで整数からポインタが作成されます

またはA

警告:異なるサイズの整数からポインタにキャストします

gcc(GCC)4.1.1 20070105(Red Hat 4.1.1-52)から

警告が消えるにはどうすればよいですか?何をキャストしようとしても、いつも警告が出ているようです。

ありがとう、チェンツ

0 投票する
2 に答える
11241 参照

c - C逆参照void*ポインター

私はCを初めて使用し、最初のプロジェクトでは配列ベースのキューを実装する必要があります。

キューで任意の種類のオブジェクトを保持できるようにしたいので、任意のタイプのオブジェクトへのvoidポインターを保持するQueueElement構造を作成しました。QueueElement構造体から「position」フィールドと「value」フィールドを読み取ることができないことを除いて、すべてが機能していると思います。コンパイルしようとすると、次のエラーが発生します。

エラー:

私は正しくキャストしていないと確信しています。どんな助けでも大歓迎です。

もう一度ありがとう、プーチ

Runnable.c

Queue.h

Queue.c

QueueElement.h

QueueElement.c

0 投票する
1 に答える
2114 参照

c++ - boost::variant および void* ポインター

ユーザー定義クラスのインスタンスを保持するバリアント型が必要です。だから私はvoid *を使用します:

マップを使用してラッパー クラスを作成しました。

使用例:

バリアント クラスのこの void* には 2 つの問題があります。

  1. 動的に割り当てられたメモリへのポインターを含む属性のコピーは危険であり、エラーが発生しやすくなります。
  2. ユーザーは void* を MyClass* ではなく、WrongClass* に static_cast できます。コンパイルはしますが、結果は予測できません。

可能な解決策:

  1. boost::shared_ptr< void* > を使用します。
  2. 内のすべての void* 値 (それらが追加されたとき) の typeid を覚えておいてくださいstd::map<void*, typeid> typeid_map。ユーザーが void* 値を要求し、それを任意の TClass* にキャストしたら、アサーションを評価しましょう: assert(typeid_from_typeid_map == typeid(TClass*)).

質問:
1. ユーザー定義クラスの値を保持する他のソリューションはありますか?
2. 上記の問題に対するより良い解決策をお勧めし、他の問題を指摘していただけますか?

0 投票する
0 に答える
1673 参照

c - C: void ポインターから関数ポインターへのキャストが定義されていないのはなぜですか?

重複の可能性:
関数ポインターとデータ ポインターが C/C++ で互換性がないのはなぜですか?

dlsym の man ページでは、次のスニペットが提供されています。

関連する仕様ページを調べましたが、void ポインターから関数ポインターへの変換を許可しない理由がわかりません。すべてのタイプのポインターに対応するのに十分な大きさであるはずの void ポインターではありません。もしそうなら、なぜこのキャストを未定義のままにしておくのですか?

0 投票する
4 に答える
637 参照

c - 構造体の複数のvoidポインタを1つのメモリに逆参照するにはどうすればよいですか?

私は特定のIPCスタック(私の場合はLCM)を介して送信する必要があるプロジェクトに取り組んでおり、IPCに可変長構造体を提供する必要があります。私は持っています

pack2へのポインターがあり、シリアル化のようなものが必要なので、これをpack2ネットワーク経由で別のプロセスに送信できます。

誰もが方法を知っていますか?

0 投票する
3 に答える
3338 参照

c - 関数を介して void へのポインターを変更するにはどうすればよいですか?

ノード内のデータを更新できるリンク リストを作成しようとしていますが、何を試しても、C では void ポインターの値 (またはそれが指す場所) を更新できないようです。 . 私が持っているテストコードは次のとおりです。

出力するだけ::

ここで明らかな何かが欠けていますか?また、ポインターへのポインターを使用してみましたが、役に立ちませんでした。