Мне было интересно в последнее время о поведении функции malloc
в C, и я наблюдал интересное поведение. Это похоже на первое значение «вне границ» после того, как malloc окажется NULL (или, по крайней мере, возвращает что-то, что считается ложным, на if
). Вот иллюстрация:Поведение malloc: первое значение «вне границ» всегда равно 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 выделяет одно слово дополнительно после того, как пространство памяти было запрошено до выделить?
Выход за пределы - это неопределенное поведение. Все может случиться, это определенно не предсказуемо. – Barmar
Попробуйте освободить память после того, как вы присвоили ей, затем выделите немного меньший блок и посмотрите, все ли вы получаете '0' в конце нового блока. – Barmar