ビット操作に関連する以前の質問で、配列がアドレスと整列していない場合、ポインターを使用してchar
配列にアクセスするコード(一度に大きなバイトのチャンクを操作するため) に問題がある可能性があると言われました。int
char
int
次に、C で考えてmalloc
、未知の型にメモリを割り当てるとどうなるのだろうと考えました。たとえば、void *p = malloc(sizeof(int));
そうすると、有効な char/int/long-aligned メモリ アドレスを取得できますか?
ここで標準を引用するSOのいくつかの回答によると、「返されたポインターは、完全なオブジェクト型のポインターに変換できるように適切に配置される必要があります」。
したがって、この場合は問題なくからchar*
に移動できることを理解しています。int*
char *p = malloc(16);
int *n = (int*)p; // use n a base of an array of 16 / sizeof(int) ints
それが正しいか?
C++ に移ると、同様のルールが標準に表示されているようです。では、これを行えばアラインメントのリスクはないと考えていいのでしょうか?
char *p = new char[16];
int *n = reinterpret_cast<int*>(p);