64ビットLinux、カーネル2.6.xで次のコードがあります。私の理解では、最初の mallocrrr=malloc(8)
はヒープに 8 バイトを割り当て、 rrr にはこれらの 8 バイトの開始アドレスの値が含まれています。それから、私は何かクレイジーなことをします。に示すように、8 バイトのポインターを 1 バイトに格納しようとしています*rrr = malloc(8)
。次に、5番目のバイトで同じことを行います。1 バイトは 255 までの値しか保持できませんが、これらのバイトに格納されている値を出力すると、値が 255 よりも大きくなります。説明していただけますか?
#include <stdlib.h>
#include <stdio.h>
void ** rrr;
int main(int argc, char ** argv)
{
rrr = malloc(8); // rrr should point to the starting address of an 8 byte block
*rrr = malloc(8);
*(rrr+5) = malloc(8);
for(int i =0;i< 8;i++)
printf("*rrr%d: %p\n", i, *(rrr+i)); // should print what is stored in each byte
return 0;
}
上記の 1 回の実行が返されます
*rrr0: 0x9ae030
*rrr1: (nil)
*rrr2: (nil)
*rrr3: 0x21
*rrr4: (nil)
*rrr5: 0x9ae050
*rrr6: (nil)
*rrr7: 0x21