Определение строковых массивов - PullRequest
2 голосов
/ 28 сентября 2019

Почему следующий приемлемый способ инициализации массива строк:

char * strings[] = { "John", "Paul", NULL};

Но этот способ не удастся:

char ** strings = { "John", "Paul", NULL};

Я думал, что он будет работать относительнотоже самое что и делать:

char string[] = "John";
char * string = "Paul";

Где оба работают.Какая разница между этими двумя?

1 Ответ

3 голосов
/ 28 сентября 2019

char * strings[] - это массив указателей .Когда вы инициализируете его как

char * strings[] = { "John", "Paul", NULL};

, строки John Paul являются строковыми литералами .Это константы, которые существуют где-то в коде или только для чтения.Для этого нужно скопировать указатель на строковый литерал John в strings[0] и так далее.т.е.

strings[0] --> holds a pointer to "John". 
strings[1] --> holds a pointer to "Paul"

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


В случае char ** strings Это указатель на указатель .Это отдельная ячейка памяти, и она не может содержать много указателей самостоятельно.Таким образом, вы не можете инициализировать его, как показано ниже.

char ** strings = { "John", "Paul", NULL};  // error

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


char string[] = "John";

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


char * string = "Paul";

Здесь у вас есть указатель на символ , который указывает на строковый литерал.

Разница между двумя приведенными выше инструкциями заключается в том, что в случае массива char вы можете изменять элементы string, но не можете во втором случае.

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