Инициализация массива char в C. Какой способ лучше? - PullRequest
4 голосов
/ 15 августа 2010

Ниже приведены два способа инициализации массива символов:

char charArray1[] = "foo";
char charArray2[] = {'f','o','o','\0'};

Если оба они эквивалентны, можно ожидать, что все будут использовать первый вариант выше (так как он требует меньше нажатий клавиш).Но я видел код, в котором автор старается всегда использовать второй метод.

Я предполагаю, что в первом случае строка «foo» сохраняется в сегменте данных и копируется в массив во время выполнения, тогда как во втором случае символы сохраняются в сегменте кода и копируются вмассив во время выполнения.И по какой-то причине у автора аллергия на наличие чего-либо в сегменте данных.

Редактировать: Предположим, что массивы объявлены локальными для функции.

Вопросы: Правильно ли мои рассуждения?Какой стиль вы предпочитаете и почему?

Ответы [ 2 ]

5 голосов
/ 15 августа 2010

А как насчет другой возможности:

char charArray3[] = {102, 111, 111, 0};

Вы не должны забывать, что тип C char является числовым типом, просто случается, что значение часто используется как код символа. Но если я использую массив для чего-то, вообще не связанного с текстом, я бы определенно предпочел инициализировать его с помощью вышеуказанного синтаксиса, чем кодировать его в буквы и ставить их в кавычки.

Если вы не хотите использовать терминал 0, вам также нужно использовать вторую форму или использовать C:

char charArray3[3] = "foo";

Это функция C, о которой почти никто не знает, но если у компилятора недостаточно места для хранения последнего 0 при инициализации charArray, он не помещает его, но код допустим. Однако этого следует избегать, поскольку эта функция была удалена из C ++, и компилятор C ++ мог бы выдать ошибку.

Я проверил ассемблерный код, сгенерированный gcc, и все разные формы эквивалентны. Единственное отличие состоит в том, что для объявления данных используются псевдо-инструкция .string или .byte. Но это всего лишь проблема читабельности, и в получившейся программе это не имеет большого значения.

1 голос
/ 15 августа 2010

Я думаю, что второй метод используется в основном в унаследованном коде, где компиляторы не поддерживают первый метод. Оба метода должны хранить данные в сегментах данных. Я предпочитаю первый метод из-за читабельности. Кроме того, мне нужно было один раз пропатчить программу (не помню, какой, это был стандартный инструмент UNIX), чтобы не использовать / etc (это было для встроенной системы). Мне было очень трудно найти правильное место, потому что они использовали второй метод, и мой grep не мог найти "и т.д." где-либо: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...