C Объявление массива char * - PullRequest
9 голосов
/ 11 июля 2009

Я думал, что вы могли бы объявить массив, а затем инициализировать его.

Вот так

char* myArray[3];


//CODE INBETWEEN 

myArray[3] = {

            "blah",
            "blah",
            "blah"};

Ответы [ 6 ]

20 голосов
/ 11 июля 2009

Нет, вы можете инициализировать массив только при первом его объявлении. Причина в том, что массивы не являются изменяемыми lvalues.

В вашем случае:

char *array[] = {"blah", "blah", "blah"};

Вам не нужно указывать размер, но вы можете, если хотите. Тем не менее, размер не может быть меньше 3 в этом случае. Кроме того, три строки записываются в постоянную память, поэтому что-то вроде array[1][2] = 'c' для изменения второго «бла» на «blch» обычно приводит к segfault.

3 голосов
/ 11 июля 2009

Как уже говорили другие, вы можете использовать инициализаторы только тогда, когда переменная объявлена. Ближайший способ сделать то, что вы хотите:

char *myArray[3];

/* CODE INBETWEEN */

{
    static const char *tmp[3] = {
            "blah",
            "blah",
            "blah" };
    memcpy(myArray, tmp, sizeof myArray);
}
1 голос
/ 11 июля 2009

Да, вы можете объявить массив, а затем инициализировать его.
Однако здесь есть исключение.
Вы объявляете массив указателей символов (который работал нормально).
И затем вы создаете экземпляры константных строк, чтобы назначить их массиву .

Вот тут и начинается проблема.
Константные строки - это просто примитивы компилятора, которые не получают адресной памяти в том виде, в каком вы их использовали. Они могут быть назначены прямо во время инициализации массива (как показало Mike); это даст указание компилятору выделить их как константы, доступные во время выполнения, и разрешить инициализацию при запуске области действия myArray.


То, что вы попробовали, сработало бы хорошо

int numberArray[3];
// code here
numberArray[0] = 1;
numberArray[1] = 2;
numberArray[2] = 3;

Следует отметить, что указатель символа и экземпляр строки - это две разные сущности; первое может указывать на второе.

0 голосов
/ 18 июля 2018

Не совсем ясно, какую проблему реального мира вы пытаетесь решить, здесь ...

Я думал, вы могли бы объявить массив,

... это возможно во многих отношениях, но ради этого вопроса я хочу сосредоточиться на объявлении массива внутри struct.

struct my_struct {
    char *my_array[3];
};

, а затем инициализировать его.

Вроде так

struct my_struct fubar;
fubar = (struct my_array) { { "hello", "world" } };

Технически говоря, это инициализация другого массива (внутри анонимного объекта) с последующим присвоением всего struct. может быть полезным для решения вашей проблемы реального мира (что бы это ни было) ... но, надеюсь, в конечном итоге кому-то еще будет полезно узнать, что вы можете назначить struct с массивами внутри них ...

0 голосов
/ 11 июля 2009

Это выражение инициализатора. Между ними не может быть этого кода, его нужно использовать в строке с объявлением.

0 голосов
/ 11 июля 2009

Вы ошиблись. Инициализация возможна только при объявлении. После этого вы можете назначать только отдельные значения.

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