Выделение памяти для структуры в C - PullRequest
28 голосов
/ 01 февраля 2010

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

x=malloc(sizeof(int)*y);

Однако, что я использую для структурной переменной? Я не думаю, что это возможно сделать

struct st x = malloc(sizeof(struct)); 

Может ли кто-нибудь мне помочь? Спасибо!

Ответы [ 7 ]

62 голосов
/ 01 февраля 2010

Мой любимый:

#include <stdlib.h>

struct st *x = malloc(sizeof *x); 

Обратите внимание:

  • x должен быть указателем
  • не требуется приведение
  • включите соответствующий заголовок
6 голосов
/ 01 февраля 2010

Вы не совсем правильно делаете. struct st x это структура, а не указатель. Это хорошо, если вы хотите выделить один в стеке. Для размещения в куче, struct st * x = malloc(sizeof(struct st));.

4 голосов
/ 01 февраля 2010

struct st* x = malloc( sizeof( struct st ));

3 голосов
/ 01 февраля 2010

Это точно можно сделать - и это правильный путь

Предполагая, что вы хотели набрать

struct st *x = malloc(sizeof(struct st)); 

пс. Вы должны выполнять sizeof (struct), даже если вы знаете размер всего содержимого, потому что компилятор может дополнить структуру так, чтобы члены были выровнены.

struct tm {
  int x;
  char y;
}

может иметь размер, отличный от

struct tm {
  char y;
  int x;
}
2 голосов
/ 02 февраля 2010

Это должно сделать:

struct st *x = malloc(sizeof *x); 
1 голос
/ 01 февраля 2010

struct st *x = (struct st *)malloc(sizeof(struct st));

0 голосов
/ 01 февраля 2010

Полагаю, когда вы вызываете sizeof для типа struct, C рекурсивно вызывает sizeof для полей struct. Таким образом, struct st *x = malloc(sizeof(struct st)); действительно работает, только если struct st имеет фиксированный размер. Это важно только в том случае, если в вашей структуре есть что-то вроде строки переменного размера, и вы НЕ хотите каждый раз указывать максимальную длину.

В общем

struct st *x = malloc(sizeof(struct st));

работает. Иногда вы можете столкнуться с структурами переменного размера или «абстрактными» структурами (например, абстрактный класс из Java), и компилятор скажет вам, что он не может определить размер struct st. В этих случаях либо вам придется вычислять размер вручную и вызывать malloc с номером, либо вы найдете функцию, которая возвращает полностью реализованную и malloc-версию нужной вам структуры.

...