7

5.2.9 静的キャストの文言を理解している限り、void*-to-to-object-pointer 変換の結果が許可されるのはvoid*、最初に逆変換の結果であった場合のみです。

void標準全体を通して、ポインターの表現や、ポインターの表現と同じポインターの表現などへの参照がたくさんありますが、任意のポインターをキャストするとポインターが生成charされると明示的に述べているようには見えません。voidメモリ内の同じ場所に、異なる型で、オブジェクトの実際の型に戻らないタイプのパニングが未定義であるのと同じように。

そのため、適切なメモリのアドレスなどをmalloc明確に返しますが、私が見た限りでは、実際にそれを移植可能に利用する方法はないようです。

4

3 に答える 3

3

C++0x 標準ドラフトには 5.2.9/13 があります。

「cv1 void へのポインター」型の右辺値は、「cv2 T へのポインター」型の右辺値に変換できます。ここで、T はオブジェクト型であり、cv2 は cv1 と同じ cv-qualification またはそれより大きい cv-qualification です。null ポインター値は、変換先の型の null ポインター値に変換されます。「cv void へのポインター」に変換されたオブジェクトへのポインター型の値は、場合によっては異なる cv 修飾を使用して、元の値を持つ必要があります。

ただし、キャストが必ずしも有効なオブジェクトになるとは限らないことにも注意してください。

 std::string* p = static_cast<std::string*>(malloc(sizeof(*p)));
 //*p not a valid object 
于 2010-04-10T18:38:29.647 に答える
2

C ++ 03、§20.4.6p2

内容は標準Cライブラリヘッダー<stdlib.h>と同じですが、次の変更があります。[ここに適用されない変更のリスト]

C99、§7.20.3.3p2-3

(C ++ 03はC89に基づいていますが、引用できるのはC99だけです。ただし、このセクションは意味的に変更されていないと思います。§7.20.3p1も役立つ場合があります。)

malloc関数は、サイズがsizeで指定され、値が不定であるオブジェクトにスペースを割り当てます。

malloc関数は、nullポインターまたは割り当てられたスペースへのポインターのいずれかを返します。

これらの2つの引用符から、mallocは初期化されていないオブジェクトを割り当ててそのオブジェクトへのポインターを返すか、nullポインターを返します。ボイドポインタとして持っているオブジェクトへのポインタは、そのオブジェクトへのポインタに変換できます(前の回答で述べたC ++03§5.2.9p13の最初の文)。


これはあなたが不満を言った「手振り」ではないはずですが、誰かが私が望むようにCのmallocの定義を「解釈」していると主張するかもしれません。たとえば、Cが「割り当てられたスペースに」ではなく「割り当てられたスペースに」と言っていることに気づきます。割り当てられたオブジェクト」。それらの人々へ:最初に「スペース」と「オブジェクト」がCの同義語であることを認識し、次に私でさえ継続するのに十分な衒学者ではないので、標準委員会に欠陥報告を提出してください。:)

私はあなたに疑いの利益を与え、あなたが「スペース」対「オブジェクト」ではなく、相互参照、相互解釈、そして時には混乱した標準間の統合につまずいたと信じています。

于 2011-01-18T16:04:26.163 に答える
1

標準全体を通して、ポインタの表現への参照がたくさんあり、voidポインタの表現はcharポインタの表現と同じです。

はい、確かに。

したがって、mallocは適切なメモリなどのアドレスを明確に返しますが、私が見た限りでは、実際にそれを移植的に利用する方法はないようです。

もちろんあります:

void * vp = malloc(1);
char * cp;
memcpy(&cp、&vb、sizeof cp);
* cp ='';

小さな問題が1つあります。それは、他のタイプでは機能しません。:(

于 2011-12-13T14:20:29.387 に答える