Когда использовать malloc для указателей char
Я специально сосредоточился на том, когда использовать malloc в указателях char
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
Будет ли malloc для того, чтобы что-то столь же тривиальное, как это? Если да, то почему? Если нет, тогда, когда это необходимо для указателей char?
Ответы
Ответ 1
Как было указано другими, вам не нужно просто использовать malloc:
const char *foo = "bar";
Причиной этого является то, что *foo
является указателем — при инициализации foo
вы не создаете копию строки, а только указатель на то, где "bar"
живет в разделе данных вашего исполняемого файла. Вы можете скопировать этот указатель так часто, как хотелось бы, но помните, что они всегда обращаются к одному и тому же экземпляру этой строки.
Итак, когда вы должны использовать malloc? Обычно вы используете strdup()
для копирования строки, которая обрабатывает malloc в фоновом режиме. например.
const char *foo = "bar";
char *bar = strdup(foo); /* now contains a new copy of "bar" */
printf("%s\n", bar); /* prints "bar" */
free(bar); /* frees memory created by strdup */
Теперь мы, наконец, обходим случай, когда вы можете использовать malloc, если используете sprintf()
или более безопасно snprintf()
, который создает/форматирует новую строку.
char *foo = malloc(sizeof(char) * 1024); /* buffer for 1024 chars */
snprintf(foo, 1024, "%s - %s\n", "foo", "bar"); /* puts "foo - bar\n" in foo */
printf(foo); /* prints "foo - bar" */
free(foo); /* frees mem from malloc */
Ответ 2
malloc
предназначен для выделения памяти в свободном хранилище. Если у вас есть строковый литерал, который вы не хотите изменять, это нормально:
char *literal = "foo";
Однако, если вы хотите изменить его, используйте его как буфер для хранения строки ввода и т.д., используйте malloc
:
char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);
Ответ 3
Используйте malloc()
, когда вы не знаете объем памяти, необходимый во время компиляции. Если у вас есть строки только для чтения, вы можете использовать const char* str = "something";
. Обратите внимание, что строка, скорее всего, будет храниться в ячейке памяти только для чтения, и вы не сможете ее изменить. С другой стороны, если вы знаете строку во время компилятора, вы можете сделать что-то вроде: char str[10]; strcpy(str, "Something");
Здесь память выделяется из стека, и вы сможете изменить str. Третий случай выделяется с использованием malloc. Допустим, вы не знаете длину строки во время компиляции. Затем вы можете сделать char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
Ответ 4
malloc для одиночных символов или целых чисел и calloc для динамических массивов. т.е. pointer = ((int *)malloc(sizeof(int)) == NULL)
, вы можете сделать арифметику в скобках malloc
, но не должны, потому что вы должны использовать calloc
, который имеет определение void calloc(count, size)
, что означает, сколько элементов вы хотите сохранить, то есть количество и размер данных, т.е. int
, char
и т.д.
Ответ 5
Каждый раз, когда размер строки не задан во время компиляции, вам необходимо выделить память с помощью malloc (или некоторого эквива лентного метода). В вашем случае вы знаете размер ваших строк во время компиляции (sizeof ( "something" ) и sizeof ( "что-то еще" )).