malloc'd память и sigsegv - PullRequest
       1

malloc'd память и sigsegv

1 голос
/ 09 февраля 2012

помогите мне понять поведение malloc .. мой код выглядит следующим образом: *

    int main()
    {   
    int *ptr=NULL;
    ptr=(int *)malloc(1);
    //check for malloc
    *ptr=1000;

    printf("address of ptr is %p and value of ptr is %d\n",ptr,*ptr);
    return 0;
    }

вышеуказанная программа работает нормально (работает без ошибок) ... как ?? как я указал значение 1000 только в 1 байте !!

Я перезаписываю следующие адреса памяти в куче? если да, то почему там не сигсгев?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Многие реализации malloc выделяют с определенным «разрешением» для эффективности.

Это означает, что даже если вы запросили за один байт, вы вполне могли получить 16 или 32.

Однако это не то, на что вы можете положиться, так как это неопределенное поведение.

Неопределенное поведение означает, что может произойти что угодно , включая все, что работает, несмотря на проблемный код :-)

1 голос
/ 09 февраля 2012

Используя отладочную кучу, вы обязательно получите аварийное завершение или какое-либо другое уведомление, когда освободите память (но не позвоните бесплатно).

Ошибки сегментации относятся к нарушениям доступа на уровне страницы, и страница памяти обычно имеет порядок 4 КБ, поэтому переполнение на 3 байта вряд ли будет обнаружено, пока какая-либо более детальная проверка не обнаружит ее или какую-либо другую часть ваш код вылетает из-за того, что вы перезаписали некоторую память 'мусором'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...