Понимание цели malloc и calloc - PullRequest
4 голосов
/ 11 декабря 2011

Я пытаюсь разобраться с C. Читая K & R, я бегаю взад и вперед, пытаясь найти, где изложены ситуации, в которых я должен динамически получать блоки памяти.

Например, я хочу получить указатель типа int.

int *pointer;

Но тогда K & R заявляет, что я могу захотеть сделать:

int *pointer;

pointer = (int*)malloc(sizeof(int));

По сути, что я здесь сделал, что отличается? В первом случае я создал указатель, который еще ни на что не указывает, поэтому я предполагаю, что если на компьютере не хватает памяти, и я пытаюсь указать ему значение типа int, у меня будут проблемы. Во втором случае резервируется место для моего указателя. Поэтому мне не нужно беспокоиться о том, что у моей программы столько же проблем с памятью. Это правильно? Если это правильно, я не должен использовать malloc (или calloc) для каждого указателя, который я создаю? Просто чтобы убедиться, что в моей программе меньше проблем?

Ответы [ 4 ]

7 голосов
/ 11 декабря 2011

malloc используется для выделения памяти.Вы можете использовать указатель, выделив его с помощью malloc или указав на уже выделенную часть памяти.

В первом случае, который вы показали, если вы не указали указатель на адрес, этоне выделены и не могут быть использованы.Например, вы можете указать ему выходное значение типа int:

int value = 0;
int* pointer;
pointer = &value;

Но вы не можете присвоить ему значение:

int value = 0;
int* pointer;
*pointer = value; // wrong because pointer is not allocated

Это то, для чего предназначен ваш второй случай.

calloc - это в основном malloc + инициализация.

Edit : Несмотря на это, это не очень хороший пример использования malloc.Лучшее использование, вероятно, когда вам нужно выделить массив переменного размера (не известен во время компиляции).Тогда вам нужно будет использовать:

int* array = (int*)malloc(N * sizeof(int));

Это полезно по двум причинам:

  1. Если N - переменная, вы не можете делать статическое распределение, например int array[N];
  2. Стек может быть ограничен тем, сколько места вы можете выделить.
3 голосов
/ 11 декабря 2011

В первом случае вы разместили в стеке указатель на целое число; и это все . Таким образом, у вас есть один указатель.

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

0 голосов
/ 08 декабря 2014

Первый случай: вы объявляете только 1 указатель переменной. Но без присвоения ему ничего. Это просто декларация.

Но во втором случае: Вы выделяете указатель памяти 1 в куче (вы можете создать n-й указатель в куче), умножив на количество элементов, которое вы хотите.

Различие между случаем 1 и случаем 2 состоит в том, что в случае 1 память будет оставаться в стеке и до завершения программы. но в случае 2 .. вы можете освободить (восстановить) память в любое время, используя free (указатель).

0 голосов
/ 11 декабря 2011

Вы должны распределять память (оптимистично) только тогда, когда это необходимо, используя calloc или malloc.Указатель также может указывать на существующую ячейку памяти.

...