Распределяет ли malloc () непрерывный блок памяти? - PullRequest
34 голосов
/ 09 марта 2009

У меня есть кусок кода, написанный очень старым школьным программистом :-). это выглядит примерно так

typedef struct ts_request
{ 
  ts_request_buffer_header_def header; 
  char                         package[1]; 
} ts_request_def; 

ts_request_def* request_buffer = 
malloc(sizeof(ts_request_def) + (2 * 1024 * 1024));

программист в основном работает над концепцией переполнения буфера. Я знаю, что код выглядит хитро. поэтому мои вопросы:

  1. Всегда ли malloc выделяет непрерывный блок памяти? потому что в этом коде, если блоки не являются смежными, код будет большой ошибкой

  2. Делая free (request_buffer), освободит ли он все байты, выделенные malloc, т.е. sizeof (ts_request_def) + (2 *1024* 1024), или только байты размера структуры sizeof (ts_request_def)

  3. Видите ли вы какие-либо очевидные проблемы с этим подходом, мне нужно обсудить это с моим боссом и хотел бы указать на любые лазейки с этим подходом

Ответы [ 14 ]

2 голосов
/ 13 марта 2009

В ответ на ваш третий вопрос.

free всегда освобождает всю память, выделенную для одного кадра.

int* i = (int*) malloc(1024*2);

free(i+1024); // gives error because the pointer 'i' is offset

free(i); // releases all the 2KB memory
2 голосов
/ 09 марта 2009

Хотелось бы добавить, что это не часто, но я бы также назвал это стандартной практикой, потому что Windows API полон такого использования.

Проверьте, например, очень распространенную структуру заголовка BITMAP.

http://msdn.microsoft.com/en-us/library/aa921550.aspx

Последняя четверка RBG - это массив 1 размера, который зависит именно от этой техники.

1 голос
/ 09 марта 2009

Ответ на вопрос 1 и 2 - Да

О уродстве (т.е. вопрос 3), что программист пытается сделать с этой выделенной памятью?

0 голосов
/ 06 сентября 2017

здесь нужно понять, что malloc не видит вычисления, сделанные в этом

malloc(sizeof(ts_request_def) + (2 * 1024 * 1024));

Это так же, как

  int sz = sizeof(ts_request_def) + (2 * 1024 * 1024);
   malloc(sz);

Вы можете подумать, что он выделяет 2 куска памяти, и, по вашему мнению, они являются "структурой", "некоторыми буферами". Но Маллок этого не видит.

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