Проблема с объявлением глобального массива строк в c - PullRequest
1 голос
/ 17 ноября 2011

Следующий код в глобальной области видимости не компилируется:

const char *one = "1";
const char *two = "2";
char *nums[2] = {one, two};

Сообщение об ошибке «Элемент инициализатора не является константой», что меня удивляет, поскольку переменные 1 и 2 оба объявлены какпостоянная.Создание чисел const не решает проблему.Объявление чисел строковыми литералами (char *nums[2] = {"1", "2"};) действительно решает проблему, но из соображений читабельности я бы не хотел делать это таким образом в моем реальном коде.

Есть ли приличныйспособ заставить это работать?

Ответы [ 3 ]

4 голосов
/ 17 ноября 2011

C не разрешает глобальную инициализацию из переменных, даже если они сами const. По сравнению с C ++ в C гораздо более строгое понятие «константное выражение».

В настоящее время one является изменяемым указателем , поэтому его нельзя считать постоянным выражением, но даже более правильный const char * const one = "1"; не будет работать в C. (Это будет хорошо в C ++.)

Вы должны будете сказать:

const char * nums[2] = { "1", "2" };
1 голос
/ 17 ноября 2011

Вы можете попробовать #define вместо ваших констант

#define ONE "1"
#define TWO "2"
/* const */ char *nums[2] = {ONE, TWO};
0 голосов
/ 06 января 2014
const char *one = "1";
const char *two = "2";

Здесь и один, и два являются строковыми константами независимо от указания квалификатора констант.Я имею в виду char *one = "1"; будет таким же, как const char *one = "1".В Си строка const инициализируется путем определения во время объявления и остается неизменной в течение всего выполнения программы.

char *nums[2]; - это массив указателей на символы, которые можно использовать двумя способами.

первый путь:

const char *one = "1";
const char *two = "2";
char *num[2] = {"1","2"}; // this is same as creating array of string const

второй путь:

const char *one = "1";
const char *two = "2";

main()
{
   int len1 = strlen(one)+1;
   int len2 = strlen(two)+1;
   nums[0] = (char *)malloc(len1);
   nums[1] = (char *)malloc(len2);
   strcpy(nums[0],one);
   strcpy(nums[1],two);
}     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...