Символьный вопрос C ++ - PullRequest
       18

Символьный вопрос C ++

1 голос
/ 02 декабря 2009

Есть ли разница между двумя приведенными ниже фрагментами? Один - это массив символов, а другой - указатель на символьный массив, но они ведут себя одинаково, не так ли?

Пример 1:

char * transport_layer_header;
// Memory allocation for char * - allocate memory for a 2 character string
char * transport_layer_header = (char *)malloc(2 * sizeof(char));
sprintf(transport_layer_header,"%d%d",1,2);

Пример 2:

char transport_layer_header[2];
sprintf(transport_layer_header,"%d%d",1,2);

Ответы [ 4 ]

11 голосов
/ 02 декабря 2009

Да, есть разница. В первом примере вы динамически распределяете двухэлементный массив символов в куче. Во втором примере у вас есть локальный двухэлементный массив символов в стеке.

В первом примере, поскольку вы не free указатель, возвращенный malloc, у вас также есть утечка памяти.

Их часто можно использовать таким же образом, например, используя sprintf, как вы демонстрируете, но они принципиально отличаются под капотом.

5 голосов
/ 02 декабря 2009

Другое отличие состоит в том, что ваш первый пример повредит данные в куче, а второй повредит данные в стеке. Никто не выделяет место для трейлинга \ 0.

3 голосов
/ 02 декабря 2009

Самое важное отличие, IMO, заключается в том, что во втором параметре transport_layer_header является указателем const (вы не можете указать его в другом месте), где, как и в первом варианте, вы можете .

Это, конечно, в дополнение к предыдущим ответам.

1 голос
/ 02 декабря 2009

Предполагая, что вы исправите проблему «нет места для нулевого значения», то есть выделите 3 байта вместо 2, вы обычно используете malloc (), только если вам нужна динамическая память. Например, если вы не знаете, насколько большим будет массив, вы можете использовать malloc.

Как указывалось, если вы используете malloc () и впоследствии не освобождаете память, значит, у вас утечка памяти.

Еще один момент: вам действительно нужно проверить возвращаемое значение malloc (), чтобы убедиться, что вы получили память. Я знаю, что в Solaris malloc () никогда не завершается с ошибкой (думал, что он может спать - хорошая причина, чтобы не вызывать его, если вы не хотите, чтобы ваш процесс шел, как отмечалось выше). Я предполагаю, что в Linux malloc () может завершиться с ошибкой (то есть, если недостаточно памяти). [Пожалуйста, поправьте меня, если я ошибаюсь.]

...