Работа с памятью, выделенной malloc - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Есть следующая проблема: Выделяем кусок памяти из кучи:
void *alloc(size_t size_of_elem, size_t count) {
    return malloc(size_of_elem * count);
}
Есть функция, которая знает тип, для которого выделяли память, и может её индексировать:
void *indexator(void *data, size_t index) {
    // функция дана для примера. Реальная знает размер выделенной памяти
    // и проводит проверку индекса.
    // Пусть, для примера, тип - int
    int *data_int = (int *)data;
    return (void *)&data[index]
}
И все это работает, до тех пор пока мы не обращаемся к памяти по индексу:
void f(void) {
    void *data = alloc(sizeof(int), 10);
    int *data_i = (int *)indexator(data, 5);
    int val = 5;
    *data_i = val; // это строчка крашит программу (Segmentation fault)
}
Однако, такой код
void f(void) {
    int *data = (int *)malloc(sizeof(int) * 10);
    int val = 5;
    *(data + 5) = val;
}
работает нормально. Подскажите, пожалуйста, в какую сторону гуглить.

Решение задачи: «Работа с памятью, выделенной malloc»

textual
Листинг программы
void *indexator(void *data, size_t index) {
    int *data_int = (int *)data;
    return data_int + index;
}

Объяснение кода листинга программы

  1. В функции indexator(void *data, size_t index) происходит работа с памятью, выделенной с помощью malloc.
  2. Переменная data является указателем на выделенную память.
  3. Переменная index содержит индекс, по которому необходимо получить доступ к памяти.
  4. При помощи приведения типа (int )data_int = (int )data происходит преобразование указателя data в указатель типа int *.
  5. Возвращаемое значение data_int + index является адресом элемента памяти, к которому необходимо получить доступ.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы