Работа с памятью, выделенной 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;
}
Объяснение кода листинга программы
- В функции indexator(void *data, size_t index) происходит работа с памятью, выделенной с помощью malloc.
- Переменная data является указателем на выделенную память.
- Переменная index содержит индекс, по которому необходимо получить доступ к памяти.
- При помощи приведения типа (int )data_int = (int )data происходит преобразование указателя data в указатель типа int *.
- Возвращаемое значение data_int + index является адресом элемента памяти, к которому необходимо получить доступ.