#include
int main() {
int i = 0;
unsigned char (*b)[5];
b = malloc( 5 );
for ( ; i < 100 ; i++ ) {
*(b+i)[0] = 192;
*(b+i)[1] = 168;
*(b+i)[2] = 0;
*(b+i)[3] = 1+i;
printf( "%d.%d.%d.%d
", *(b+i)[0], *(b+i)[1], *(b+i)[2], *(b+i)[3] );
}
return 0;
}
В моем понимании функция malloc() выделяет только 5 байт , и как минимум на 6-м шаге цикла ( i == 5 ) указатель должен выйти за рамки отведенной процессу памяти, почему этого не происходит?
Собираю с помощью gcc version 4.9.2 (Debian 4.9.2-10)
Ответ
Из комментария пользователя @nick_n_a
Потому что размер страницы памяти 4096 байт (по умолчанию, так сказать «квант» памяти), и fail может наступить только если для следущей страницы не сделано allocate. Поэтому даже переходя за грань 4096 fail может быть а может и не быть. Пока программа маленькая такие трюки могут заканчиваться ничем, а при большой программе можно получить глюки, которые очень сложно отловить.
Если у вас стоит задача получить seg-fail, то можно пробовать читать/писать с шагом 4096 байт.
Комментариев нет:
Отправить комментарий