Вместо определения динамически размещаемой структуры в C - PullRequest
1 голос
/ 10 ноября 2010

Если бы я определил статически распределенную структуру на месте, я бы сделал: struct mystructure x = {3, 'a', 0.3}; Есть ли способ, которым я могу сделать то же самое в C, но с помощью malloc. Конечно, я мог бы сделать struct mystructure x = createNewMystruct (3, 'a', 0.3), (где я бы определил функцию createNewMyStruct), но я хотел бы знать, есть ли другой возможный способ.

Спасибо.

Ответы [ 6 ]

4 голосов
/ 10 ноября 2010

Самое близкое, о чем я могу подумать, это:

struct mystructure *p = malloc(sizeof(*p));
assert(p);
*p = (const struct mystructure){3, 'a', 0.3};

Только C99, так что не плачь, если он не работает в MSVC.

2 голосов
/ 10 ноября 2010

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

0 голосов
/ 10 ноября 2010

Вы можете сделать это с анонимным блоком:

// Anonymous block
{
   struct mystruct tmp = { ... };

   realstruct = malloc ( sizeof ( struct mystruct ) );
   if ( NULL == realstruct )
       goto error;

   *realstruct = tmp;
}

... также я думаю, что вы можете сделать что-то подобное в C99 ...

// After allocation
*realstruct = (struct mystruct){ ... };
0 голосов
/ 10 ноября 2010

Я не знаю, зачем вам это нужно, но вы можете использовать функцию sizeof (), чтобы определить, какой размер имеет любой тип, и просто указать, что вам нужно. Ссылка на правильную «переменную» внутри этой конструкции была бы вашей собственной проблемой, конечно! : -)

char* x = malloc(sizeof(int) + sizeof(char) + sizeof(float);
0 голосов
/ 10 ноября 2010

Нет, то, что вы описываете, не может быть сделано в куче. (malloc) Ближайшим является calloc (), который инициализирует всю выделенную память нулю.

0 голосов
/ 10 ноября 2010

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

Не в стандарте C, нет.

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