Подтвердить что ты не робот

Когда использовать malloc для указателей char

Я специально сосредоточился на том, когда использовать malloc в указателях char

char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";

Будет ли malloc для того, чтобы что-то столь же тривиальное, как это? Если да, то почему? Если нет, тогда, когда это необходимо для указателей char?

4b9b3361

Ответ 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 ( "что-то еще" )).