2009-11-24 2 views
30

Я специально ориентирован на использование при таНосе на голец указателяхКогда использовать таНос для символьных указателей

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

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

ответ

30

Как было отмечено другими, вам не нужно использовать таНос просто сделать:

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 */ 
+0

Что было бы неправильно с: char * foo = "bar"; char * bar = foo; printf ("% s \ n", bar); – ZPS

+1

Во-первых, это должно быть 'const char * foo ...', во-вторых, в вашем примере, который просто копирует указатель, а не данные. 'strdup()' фактически копирует данные. – scotchi

+0

Здесь было предложено изменение, переводя результат malloc в '(char *)'. Это необходимо, когда этот код используется в C++, но обычно этот код * не должен использоваться * в C++, поэтому я вернул редактирование. – scotchi

9

malloc предназначено для распределения памяти на свободном складе. Если у вас есть строка буквальной, что вы не хотите, чтобы изменить следующее нормально:

char *literal = "foo"; 

Однако, если вы хотите быть в состоянии изменить его, использовать его в качестве буфера для хранения строки ввода и так на, используйте malloc:

char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */ 
// ... 
free(buf); 
4

используйте malloc(), когда вы не знаете, объем памяти, необходимый во время компиляции. Если у вас есть строки только для чтения, вы можете использовать const char* str = "something";. Обратите внимание, что строка, скорее всего, будет храниться в ячейке памяти только для чтения, и вы не сможете ее изменить. С другой стороны, если вы знаете строку во время компилятора, вы можете сделать что-то вроде: char str[10]; strcpy(str, "Something"); Здесь память выделена из стека, и вы сможете изменить str. Третий случай выделяется с использованием malloc. Допустим, вы не знаете длину строки во время компиляции. Затем вы можете сделать char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);

1

Everytime размер строки неопределенный во время компиляции вы должны выделять память с таНос (или каким-либо способом equiviallent). В вашем случае вы знаете размер ваших строк во время компиляции (sizeof («something») и sizeof («something else»)).

2

malloc для одиночных символов или целых чисел и calloc для динамических массивов. т.е. pointer = ((int *)malloc(sizeof(int)) == NULL), вы можете выполнять арифметические действия в скобках malloc, но вы не должны, потому что вы должны использовать calloc, который имеет определение void calloc(count, size), что означает, сколько элементов вы хотите сохранить то рассчитывать и размер данных, т.е. int, char и т.д.

Смежные вопросы