最近私はmalloc
のCの動作について興味を持ち、面白い動作を見ました。 mallocがNULLであることが判明した後の最初の 'out of bounds'値のように見えます(または、少なくとも、if
によってfalseとみなされるものを返します)。ここ は例示である:mallocの動作は最初に 'out of bounds'の値が常にNULL/0ですか?
int main(){
int i;
double * d_ptr = malloc (10 * sizeof (double)); //malloc 10 double
for (i=0 ; i<10 ; i++){ // initialise them ...
d_ptr[i] = 42;
}
for (i=0 ;i <50 ; i++){ /// loop obviously trying to go out of bounds
if (d_ptr[i]){
printf("i=%d,d[%d]=%f\n",i,i,d_ptr[i]);
}
else {
printf("out of bounds : i=%d\n",i);
break;
}
}
printf("exited 'out of bounds loop' safely\n");
free(d_ptr);
return 0;
}
は、ここで出力です:
i=0,d[0]=42.000000
i=1,d[1]=42.000000
i=2,d[2]=42.000000
i=3,d[3]=42.000000
i=4,d[4]=42.000000
i=5,d[5]=42.000000
i=6,d[6]=42.000000
i=7,d[7]=42.000000
i=8,d[8]=42.000000
i=9,d[9]=42.000000
out of bounds : i=10
exited 'out of bounds loop' safely
は、私の質問は以下のとおりです。
予測可能で、この動作ですか?私は変数の種類の束、mallocのための異なったサイズを試しました、そして、私はいつもループを安全に終了しています。それは予測可能である場合
は、は、それが彼らの「サイズ」を知ることが難しいこと、または書き換えの多くを必要とする状況で、ポインタ上のループへの信頼性の高い方法になることができますか?
- 最後に、それについてもっと深い説明はありますか? mallocを実行する メモリスペースの後に1ワード余分に割り当てると、 が割り当てられますか?
境界外にアクセスすることは、未定義の動作です。何かが起こる可能性があります。それは最も確実に予測できません。 – Barmar
割り当てた後にメモリを解放してから、少し小さいブロックを割り当てて、新しいブロックの終わりにまだ '0'があるかどうかを確認してください。 – Barmar