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

С точки зрения питания любой текущий Mac хорошо для разработки iPhone. Вы могли бы хотеть рассмотреть другие факторы, которые зависят от того, как Вам нравится работать.

Вам нравится иногда захватывать машину и просто входить в различную рабочую среду (или показывать Ваш материал людям)? MacBook сопоставимы мудрый питанием, но дают Вам ту свободу.

можно ли работать с глянцевыми экранами, или они раздражают Вас? В последнем случае iMac или MacBook могут быть субоптимальными, и необходимо удостовериться, что Вы получаете более крупный, неглянцевый дисплей как основной экран. Второй дисплей обычно очень полезен для разработки, таким образом, Вы могли бы хотеть иметь тот так или иначе.

И Вы действительно захотите продвинуть RAM по крайней мере к 2 ГБ (4 ГБ хороши, конечно, но не абсолютно необходимы).

34
задан Bastien Léonard 24 November 2009 в 08:31
поделиться

4 ответа

Как было указано другими, вам не нужно использовать 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 */
32
ответ дан 27 November 2019 в 16:55
поделиться

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

char *literal = "foo";

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

char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);
14
ответ дан 27 November 2019 в 16:55
поделиться

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

5
ответ дан 27 November 2019 в 16:55
поделиться

Каждый раз, когда размер строки не определен во время компиляции, вам нужно выделить память с помощью malloc (или другого эквивалентного метода). В вашем случае вы знаете размер ваших строк во время компиляции (sizeof («что-то») и sizeof («что-то еще»)).

1
ответ дан 27 November 2019 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: