Я думал, что вы можете объявить массив, а затем инициализировать его.C Объявление массива char *
Как так
char* myArray[3];
//CODE INBETWEEN
myArray[3] = {
"blah",
"blah",
"blah"};
Я думал, что вы можете объявить массив, а затем инициализировать его.C Объявление массива char *
Как так
char* myArray[3];
//CODE INBETWEEN
myArray[3] = {
"blah",
"blah",
"blah"};
Нет, вы можете только инициализировать массив при первом его объявить. Причина в том, что массивы не изменяются lvalues.
В вашем случае:
char *array[] = {"blah", "blah", "blah"};
Вам не нужно указывать размер, но вы можете, если вы хотите. Однако в этом случае размер не может быть меньше 3. Кроме того, три строки записываются в память только для чтения, поэтому что-то вроде array[1][2] = 'c'
для изменения второго «бла» на «blch» обычно приводит к segfault.
Точнее, массивы в большинстве контекстов оценивают значения rvalues, а не lvalues и присвоение rvalue недопустимы. – caf
Собственно, ваше объяснение, вероятно, более корректно. Отредактировал мой пост. –
Вы считали неправильным. Инициализация возможна только по адресу:. После этого вы можете назначать только отдельные значения.
Это выражение инициализатора. Нельзя иметь этот код между ними, который должен использоваться в объявлении линии.
Как уже было сказано, вы можете использовать только инициализаторы при объявлении переменной. Самый близкий способ сделать то, что вы хотите:
char *myArray[3];
/* CODE INBETWEEN */
{
static const char *tmp[3] = {
"blah",
"blah",
"blah" };
memcpy(myArray, tmp, sizeof myArray);
}
Да, вы можете объявить массив и затем инициализировать его позже.
Однако здесь есть исключение.
Вы объявляете массив символов (который отлично работал).
И тогда вы являетесь , создавая постоянные строки, чтобы назначить их массиву.
В этом случае проблема начинается.
Константные строки - это просто примитивы компилятора, которые не получают адресной памяти в том виде, в котором вы их использовали. Они могут быть назначены прямо на время инициализации массива (как показано на рисунке Mike
); который даст указание компилятору выделить их в качестве констант, доступных во время выполнения, и разрешить инициализацию при запуске области myArray
.
То, что вы попытались бы хорошо работал с
int numberArray[3];
// code here
numberArray[0] = 1;
numberArray[1] = 2;
numberArray[2] = 3;
Это помогает отметить, что указатель на символ и экземпляр строки являются двумя различными сущностями; первый может указывать на второй.
В вашем примере вы не инициализируете значения. Вы просто устанавливаете значение. Оптимизатор может включить то, что вы написали, для инициализации, но нет гарантии. – Jared
@ Jared, я буду голосовать и прокомментировать в духе точного значения 'initialization'.Однако я не думаю, что этот вопрос означал слово в этом смысле. – nik
Вы объявляете массив указателей на символы. Каждому указателю необходимо указать динамический или статический буфер, прежде чем вы сможете использовать операции strcpy() или другие строковые операции для изменения содержимого. – stanigator
Так что мне нужно одновременно инициализировать и объявить?> – 2009-07-11 05:44:19