2015-12-15 4 views
2

Я прошел через проект C, чтобы понять некоторые понятия и нашел следующий код.Как определить общее распределение памяти?

#define MY_NODE_ALLOC(coffee) ((struct items *)(coffee) + 1) 

struct store 
{ 
    char *name; 
    int id; 
}; 

struct items 
{ 
    char *itemName 
    char *itemCode; 
    int quantity; 
}; 

void * allocation(struct store *shop) 
{ 
    struct items *coffee = malloc(sizeof(struct items) + sizeof(*shop)); 
    return MY_NODE_ALLOC(coffee); 
} 

я следующие вопросы

  1. Сколько общей памяти выделяется? он равен размеру *shop и struct items?

  2. В чем разница между 2 заявления malloc(sizeof(struct itmes)); и malloc(sizeof(*shop));

  3. Что возвращает этот макрос? По моему мнению, добавление 1 к указателю используется для перехода к следующему элементу в массиве, но я не понимаю этого случая.

ответ

2

1- Сколько общей памяти выделяется? он равен размеру *shop и struct items?

Да, общий размер вместе, в байтах, в случае malloc() успех.

2- В чем разница между 2 и отчетности malloc(sizeof(struct itmes));malloc(sizeof(*shop));

Два высказывания выделяют различное количество памяти, в случае успеха.

  • malloc(sizeof(struct itmes)); выделяет столько байт, сколько от размера struct itmes в байтах.
  • malloc(sizeof(*shop); выделяет в байтах столько байтов, сколько от *shop (struct store).

3- Что возвращает этот макрос? По моему пониманию добавление 1 к указателю используется для перехода к следующему элементу в массиве, но я не понимаю этот случай.

Да, вы правы. Сначала они набрасывают указатель на struct items *, а затем увеличивают указатель, указывая на следующий адрес памяти типа struct items *. Для уточнения, давайте цитировать C11, глава §6.5.6

Когда выражение, которое имеет целочисленный тип добавляется или вычитается из указателя, то результат имеет тип указателя операнда. Если операнд указателя указывает на элемент объекта массива, и массив достаточно велик, результат указывает на смещение элемента от исходного элемента таким образом, что разность индексов результирующего и исходного элементов массива равна целочисленное выражение. [....]

+1

Общее распределение составляет _at наименьшее, как указано значение (при успешном); на практике это всегда больше (для накладных расходов malloc) и игнорирования накладных расходов malloc, по-прежнему, вероятно, больше (для проблем с выравниванием). – mah

+1

@mah Правда в целом, но не упоминается в стандарте. C11/7.22.3.4 _ Функция malloc выделяет пространство для объекта, размер которого задается size_ .... –

+0

Malloc также захватывает память с ОС - это большие куски, чтобы ограничить переключение контекста. –

Смежные вопросы