C: установка элемента массива структуры через указатель - PullRequest
1 голос
/ 25 октября 2010

У меня есть структура с массивом в качестве члена, и я пытаюсь установить этот массив, используя синтаксис стрелки.Что у меня есть:

typedef float Foo[3];
typedef struct {
  Foo foo;
} Bar;

Bar* f() {
  Bar* bar = malloc(sizeof(Bar));
  bar->foo = {1.0, 1.0, 1.0};

  return bar;
}

gcc говорит:

error: expected expression before '{' token

на линии bar->foo = {1.0, 1.0, 1.0};

Я в недоумении, почему это не работает.Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 25 октября 2010

C99 позволяет это через составные литералы:

Bar* f()
{
   Bar* bar = malloc(sizeof(Bar));

   if (bar)
       *bar = (Bar){{1.0, 1.0, 1.0}};

   return bar;
}

& ldquo; внешний & rdquo; curlies инкапсулируют структуру как единое целое (если бы в структуре были другие члены, вы бы перечислили их во внешних curly) и & ldquo; inner & rdquo; curlies для массива.

1 голос
/ 25 октября 2010

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

float foo[3] = {1.0, 1.0, 1.0};

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

0 голосов
/ 25 октября 2010

Попробуйте

float bar[3] = {1.0, 2.0, 3.0};
float foo[3];
foo = {1.0, 2.0, 3.0};

Это пример разницы между инициализацией и назначением, и в c нет оператора присвоения для массивов.

Обратите внимание, что вы можете do

Bar baz, quix
/* quix get setup some how... */
bar = quix;

, поскольку на struct s есть операция присваивания, как работает dreamlax .

0 голосов
/ 25 октября 2010

Это не поддерживаемый синтаксис.Вы можете инициализировать массивы только при их создании - вы не можете назначить созданный массив.

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