いいえ、これはメモリが割り当てられ、文字型を使用して書き込まれたためです。
メモリはmallocを使用して割り当てられます。そのオブジェクトは、型がmallocで割り当てられているため、宣言されていません。したがって、オブジェクトには有効な型はありません。
次に、コードはchar
タイプを使用してオブジェクトにアクセスし、変更します。タイプは、 char
であり、効果的な型を有するいかなる目的は、は、コピーがこれと後続のアクセスのためにchar
に有効なタイプを設定していないコピーされていないが、唯一の期間、char
に有効なタイプを設定するようにアクセス。アクセス後、オブジェクトはもはや有効な型を持たない。
次に、タイプint
を使用して、そのオブジェクトにアクセスし、読み取るだけです。オブジェクトが有効な型を持たないので、読み取りの間、 int
になります。アクセス後、オブジェクトはもはや有効な型を持たない。 int
が明らかに有効なタイプint
と互換性があったため、動作が定義されています。
(値はint
のトラップ表現ない読み取ると仮定。)
あなたもint
と互換性のない文字以外のタイプを使用してオブジェクトにアクセスし、変更たならば、動作は未定義であろう。
のは、あなたの例は、(sizeof(float)==sizeof(int)
を想定)されたとしましょう:
int i;
void *buf = calloc(5, sizeof(float)); // buf initialized to 0
{
float *ptr1 = buf;
for(i = 0; i < 5*sizeof(float); ++i)
ptr1[i] = (float)i;
}
int *ptr2 = buf;
for(i = 0; i < 5; ++i)
printf("%d", ptr2[i]);
float
sが書き込みの期間およびそれ以降のすべてのために、タイプfloat
のとなりに書き込まれているオブジェクトの効果的なタイプ、それを変更しないオブジェクトへのアクセス。これらのオブジェクトがint
によってアクセスされると、有効なタイプはfloat
のままです。値は読み取られないためです。以前の書き込みfloat
を使用すると、有効なタイプはfloat
に設定され、このオブジェクトへの次回の書き込み(この場合は発生しませんでした)まで永続的に設定されました。タイプint
とfloat
は互換性がありません、したがって動作は未定義です。
(以下のすべてのテキストがから引用されている:ISO:IEC 9899:201X)
(6.5式6)は、その格納された値にアクセスするためのオブジェクトの
有効なタイプでありますオブジェクトの宣言された型(存在する場合) 87)割り当てられたオブジェクトに宣言された型はありません。
(6.5式6)
値を文字タイプないタイプを持つ左辺値を通る宣言された型を持たないオブジェクトに格納されている場合には、左辺値のタイプが有効になりますそのアクセスのためのオブジェクトのタイプと、格納された値を変更しない後続のアクセスのためのオブジェクトのタイプ。
ない宣言された型を持たないオブジェクトへの他のすべてのアクセスについて(6.5式6)
、オブジェクトの有効なタイプは、単にアクセスに使用左辺のタイプです。 - オブジェクトの有効な種類と互換性のあるタイプ88) :(6.5式8)
オブジェクトのみ 次のタイプの1つを有する左辺値表現によってアクセスその格納された値を持たなければならない
- オブジェクトの有効な型と互換性のある型の修飾バージョン - オブジェクトの有効な型に対応する符号付きまたは符号なし型である型 - 符号付きまたは符号なし型である型オブジェクトの有効なタイプ の修飾バージョンに対応して、
(6。5式6)
memcpyまたはmemmoveを使用して宣言された型を持たないオブジェクトに値がコピーされるか、または文字型の配列としてコピーされた場合、そのアクセスのための変更されたオブジェクトの有効な型と、値を変更しないは値がコピーされているオブジェクトの有効なタイプです(存在する場合)。
あなたは暗黙のうちに、私が考えていなかった興味深い点を挙げています:割り当てられたメモリは 'int'値によって割り当てられていないので、6.5段落6の' int' 'int *'で逆参照されるため、結局は厳密なエイリアシングに違反しますか?そのパラグラフを解析するのは辛いです。 –
この時点で、オブジェクトには文字だけが書き込まれ、有効な型はオブジェクトに設定されませんでした。宣言された型を持たないオブジェクトへの他のすべてのアクセスの場合、オブジェクトの実効型は単純にアクセスに使用される左辺値の型です* – 2501
その同じ点で 'int 'が読み込みの代わりにオブジェクトに書き込まれていた場合、その型はまたint型になります:*型が文字型ではない型を持つlvalueを通して宣言型を持たないオブジェクトに格納されている場合、左辺の型がそのアクセスのためのオブジェクトの有効な型になり、格納された値を変更しない後続のアクセスのために* – 2501