Когда мне следует использовать malloc в C, а когда нет?

Я понимаю, как работает malloc (). Мой вопрос, я увижу такие вещи:

#define A_MEGABYTE (1024 * 1024)

char *some_memory;
size_t size_to_allocate = A_MEGABYTE;
some_memory = (char *)malloc(size_to_allocate);
sprintf(some_memory, "Hello World");
printf("%s\n", some_memory);
free(some_memory);

Я пропустил проверку ошибок для краткости. Мой вопрос: , не могли бы вы просто сделать это, инициализировав указатель на какое-то статическое хранилище в памяти? Возможно:

char *some_memory = "Hello World";

В какой момент вам действительно нужно выделить память самостоятельно вместо объявления / инициализации значений, которые вам нужно сохранить?

91
задан James McNellis 20 June 2010 в 00:53
поделиться

5 ответов

char *some_memory = "Hello World";

создает указатель на строковую константу. Это означает, что строка «Hello World» будет где-то в доступной только для чтения части памяти, и у вас есть только указатель на нее. Вы можете использовать строку только для чтения. Вы не можете вносить в него изменения. Пример:

some_memory[0] = 'h';

Вызывает проблемы.

С другой стороны,

some_memory = (char *)malloc(size_to_allocate);

выделяет массив символов (переменную), а some_memory указывает на эту выделенную память. Теперь этот массив доступен для чтения и записи. Теперь вы можете сделать:

some_memory[0] = 'h';

и содержимое массива изменится на «hello World»

130
ответ дан 24 November 2019 в 06:44
поделиться

В этом точном примере от malloc мало пользы.

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

Вторая причина в том, что C не имеет возможности узнать, достаточно ли места в стеке осталось для выделения. Если ваш код должен быть на 100% устойчивым, безопаснее использовать malloc, потому что тогда ваш код может узнать о сбое выделения и обработать его.

37
ответ дан 24 November 2019 в 06:44
поделиться

malloc - прекрасный инструмент для выделения, перераспределения и освобождения памяти во время выполнения по сравнению со статическими объявлениями, такими как ваш привет, мир example, которые обрабатываются во время компиляции и поэтому не могут быть изменены в размере.

Таким образом, Malloc всегда полезен, когда вы имеете дело с данными произвольного размера, например, при чтении содержимого файла или работе с сокетами, и вы не знаете длины данных для обработки.

Конечно, в тривиальном примере, подобном приведенному вами, malloc - это не волшебный «правильный инструмент для правильной работы», но для более сложных случаев (например, создание массива произвольного размера во время выполнения), это единственный выход.

16
ответ дан 24 November 2019 в 06:44
поделиться
char *some_memory = "Hello World";
sprintf(some_memory, "Goodbye...");

недопустимо, строковые литералы имеют вид const .

Это выделит 12-байтовый массив символов в стеке или глобально (в зависимости от того, где он объявлен).

char some_memory[] = "Hello World";

Если вы хотите оставить место для дальнейших манипуляций, вы можете указать, что размер массива должен быть больше. (Пожалуйста, не помещайте 1 МБ в стек.)

#define LINE_LEN 80

char some_memory[LINE_LEN] = "Hello World";
strcpy(some_memory, "Goodbye, sad world...");
printf("%s\n", some_memory);
6
ответ дан 24 November 2019 в 06:44
поделиться

Одна из причин, по которой необходимо выделить память, заключается в том, что вы хотите изменить ее во время выполнения. В этом случае можно использовать malloc или буфер в стеке. Простой пример присвоения указателю «Hello World» определяет память, которая «обычно» не может быть изменена во время выполнения.

5
ответ дан 24 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: