2009-07-11 3 views
8

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

Как так

char* myArray[3]; 


//CODE INBETWEEN 

myArray[3] = { 

      "blah", 
      "blah", 
      "blah"}; 
+1

Вы объявляете массив указателей на символы. Каждому указателю необходимо указать динамический или статический буфер, прежде чем вы сможете использовать операции strcpy() или другие строковые операции для изменения содержимого. – stanigator

+0

Так что мне нужно одновременно инициализировать и объявить?> – 2009-07-11 05:44:19

ответ

18

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

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

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

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

+2

Точнее, массивы в большинстве контекстов оценивают значения rvalues, а не lvalues ​​и присвоение rvalue недопустимы. – caf

+0

Собственно, ваше объяснение, вероятно, более корректно. Отредактировал мой пост. –

0

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

0

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

2

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

char *myArray[3]; 

/* CODE INBETWEEN */ 

{ 
    static const char *tmp[3] = { 
      "blah", 
      "blah", 
      "blah" }; 
    memcpy(myArray, tmp, sizeof myArray); 
} 
1

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

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


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

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

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

+0

В вашем примере вы не инициализируете значения. Вы просто устанавливаете значение. Оптимизатор может включить то, что вы написали, для инициализации, но нет гарантии. – Jared

+0

@ Jared, я буду голосовать и прокомментировать в духе точного значения 'initialization'.Однако я не думаю, что этот вопрос означал слово в этом смысле. – nik

Смежные вопросы