C инициализация массива или структуры, я могу сделать это после объявления? - PullRequest
2 голосов
/ 28 февраля 2011

Я знаю, что С позволяет мне это делать.

char *array[] = {"String1", "String2",...};

но я хочу это сделать.

char **array or char *array[3]; array = {"String1", "String2"...};

Потому чтоЯ думаю, что использование цикла для полного заполнения массива очень плохо, вместо инициализации, как показано.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 28 февраля 2011

Нет - синтаксис инициализации только работает для инициализации, а не для присвоения, поэтому должен быть частью определения массива, а не впоследствии. После этого вам нужно было бы назначить массив вместо его истинной инициализации, а C не поддерживает присвоение массива.

2 голосов
/ 28 февраля 2011

Краткий ответ: нет, вы не можете.

При инициализации такого нестатического массива, как этот, компилятор должен сгенерировать код для копирования начального состояния массива из хранилища в новоемассив.(Потому что это новый массив каждый раз, когда вы вызываете функцию.) На самом деле писать код, который делает это самостоятельно, не намного медленнее.

Длинный ответ: если вы хотите быть злымВы можете сделать это в C99, заключив массив в структуру и используя присвоение структуры ...

struct arrayWrapper
{
  char* array[4];
};

{
  struct arrayWrapper d;
  ...
  d = (struct arrayWrapper){{1, 2, 3, 4}};
}

(синтаксис может быть не совсем правильным.)

Ноэто зло, и работает только в C99, так что не делай этого, ммм'кей?

2 голосов
/ 28 февраля 2011

Как говорит @Jerry, вы не можете сделать это для массива. Ваш вопрос упоминает структуры, и вы можете сделать это для структуры. например,

struct mystruct {
   int a;
   int b;
};

struct mystruct mystruct;

mystruct = (struct mystruct){1, 2};

присвоит mystruct.a 1 и mystruct.b 2

1 голос
/ 28 февраля 2011

Основные понятия здесь: изменяемое значение l * значение и составные литералы и инициализаторы .

Массив не считается изменяемым lvalue , поэтому следующее никогда не будет работать:

int i[];
int j[];
i = j;

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

Составные литералы очень похожи на инициализаторы , но это две разные концепции с похожим синтаксисом. Инициализаторы появляются с определениями, тогда как составные литералы могут появляться в произвольных выражениях.

Так как указатель является изменяемым lvalue , вы можете присвоить ему составной литерал :

char** array;
array = (char* []) {"zero", "one", "two"};
0 голосов
/ 28 февраля 2011

Ответ для массива, который дал Джерри, правильный, но не для структуры.

    #include <stdio.h>

struct foo {
  int v1;
  int v2;
};


int main(void){
  struct foo v1, v2;

  v1.v1 = 1;
  v1.v2 = 2;
  v2 = v1;

  printf("v2.v1 = %d, v2.v2 = %d\n", v2.v1, v2.v1);
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...