Как было отмечено другими, вам не нужно использовать таНос просто сделать:
const char *foo = "bar";
Причиной этого является именно то *foo
является указатель — когда вас initialize 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 */
Теперь мы, наконец, обойти в случае, когда вы можете захотеть таНос, если вы используете 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 */
Что было бы неправильно с: char * foo = "bar"; char * bar = foo; printf ("% s \ n", bar); – ZPS
Во-первых, это должно быть 'const char * foo ...', во-вторых, в вашем примере, который просто копирует указатель, а не данные. 'strdup()' фактически копирует данные. – scotchi
Здесь было предложено изменение, переводя результат malloc в '(char *)'. Это необходимо, когда этот код используется в C++, но обычно этот код * не должен использоваться * в C++, поэтому я вернул редактирование. – scotchi