#include <stdio.h>
main()
{
int *ptr1 = malloc ( 2 );
int *ptr2 = malloc ( 4 );
int *ptr3 = malloc ( 16 );
printf("ptr1 - %x \n", ptr1);
printf("ptr2 - %x \n", ptr2);
printf("ptr3 - %x \n", ptr3);
*ptr1 = 0x1111;
*ptr2 = 0x2222;
*ptr3 = 0x3333;
#if 1
// silent corruption...
*(ptr1+2) = 0xabcd;
#endif
#if 1
// corruption
*(ptr1+3) = 0xbeee;
#endif
{
int a;
scanf("%d", &a);
}
free(ptr1);
free(ptr2);
free(ptr3);
}
上記のプログラムでは、ptr のアドレスを、差分 4 バイトではなく、ptr1、ptr2、ptr3 間の差分 0f 10 として取得します。また、ここでスタックの破損をチェックしています。データ セグメント (ptr1、ptr2、ptr3) の値は、スタック セグメント (a) の値をどのように破壊しますか。そして、この静かな腐敗は何ですか。