Доступ за пределами памяти malloc () - PullRequest
0 голосов
/ 26 мая 2019

У меня вопрос, когда я выделяю память для переменной go, как в следующем коде, я могу достичь области, которую я не выделил (в данном случае после первой). Так какова граница этой верхней точки достижения, потому что, когда я пытаюсь распечатать или получить доступ к тысячному месту, я получаю ошибку сегментации. Как ОС (Ubuntu 18.04) ограничивает эту область?

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
    int *go=NULL;
    go = malloc(sizeof(int)*1);
    *go = 190;
    *(go+1)=20;
    *(go+2)=-13;
    *(go+3)=450;
    *(go+4)=140;
    *(go+5)=190;
    printf("%d\n",*(go));
    printf("%d\n",*(go+1));
    printf("%d\n",*(go+2));
    printf("%d\n",*(go+3));
    printf("%d\n",*(go+4));
    printf(">>>%d\n",*(go+5));
    return 0;
}

1 Ответ

3 голосов
/ 26 мая 2019

Адресное пространство выделяется приложением из ОС.Эти распределения имеют гранулярность, которая является функцией аппаратного обеспечения, операционной системы и параметров библиотеки malloc.Немногие архитектуры имеют побайтовую гранулярность.

Malloc обычно не является интерфейсом операционной системы, скорее это очень удобная библиотека, построенная на менее сложных механизмах.Malloc определяет, какую гранулярность он хочет увеличить и уменьшить адресное пространство, и создает структуры данных для отслеживания памяти в удобном для нее размере.Например, он может никогда не вернуть объект размером менее 64 байт.Вы могли бы определить это, используя realloc: выделить набор небольших объектов (скажем, 1 байт) и найти два ближайших друг к другу адреса, а затем вызвать grow () ниже с нижним указателем, и эторазница.Возможно, у вас нетрадиционный malloc, и это не сработает ....

int grow(void *p, int maxdiff) {
    int i;

    for (i = 2; i < maxdiff; i++) {
        void *t = realloc(p, i);
        if (t != p) {
            return i;
        }
    }
    return -1;
}

Для хорошего учебника по malloc () прочитайте и поймите реализацию этого в K & R "The CЯзык программирования ".

...