Я понимаю, как работает 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";
В какой момент вам действительно нужно выделить память самостоятельно вместо объявления / инициализации значений, которые вам нужно сохранить?
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»
В этом точном примере от malloc мало пользы.
Основная причина, по которой требуется malloc, - это когда у вас есть данные, время жизни которых должно отличаться от области действия кода. Ваш код вызывает malloc в одной подпрограмме, где-то хранит указатель и, в конце концов, вызывает free в другой подпрограмме.
Вторая причина в том, что C не имеет возможности узнать, достаточно ли места в стеке осталось для выделения. Если ваш код должен быть на 100% устойчивым, безопаснее использовать malloc, потому что тогда ваш код может узнать о сбое выделения и обработать его.
malloc - прекрасный инструмент для выделения, перераспределения и освобождения памяти во время выполнения по сравнению со статическими объявлениями, такими как ваш привет, мир example, которые обрабатываются во время компиляции и поэтому не могут быть изменены в размере.
Таким образом, Malloc всегда полезен, когда вы имеете дело с данными произвольного размера, например, при чтении содержимого файла или работе с сокетами, и вы не знаете длины данных для обработки.
Конечно, в тривиальном примере, подобном приведенному вами, malloc - это не волшебный «правильный инструмент для правильной работы», но для более сложных случаев (например, создание массива произвольного размера во время выполнения), это единственный выход.
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);
Одна из причин, по которой необходимо выделить память, заключается в том, что вы хотите изменить ее во время выполнения. В этом случае можно использовать malloc или буфер в стеке. Простой пример присвоения указателю «Hello World» определяет память, которая «обычно» не может быть изменена во время выполнения.