2010-02-01 3 views
27

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

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

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

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

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

+0

, когда вы сомневаетесь, попробуйте это! –

+1

@Blackbinary: Почти там. Правильный синтаксис - 'malloc (sizeof (struct st))'. Конечно, 'sizeof * x', указанный ниже, является предпочтительным. – kennytm

+0

+1 от меня ... хороший вопрос и полезен для новичка! – t0mm13b

ответ

61

Мой любимый:

#include <stdlib.h> 

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

Обратите внимание, что:

  • x должен быть указателем
  • не литой не требуется
  • включает соответствующий заголовок
+5

Приятно то, что он принуждает 'x' быть указателем. –

+12

Не позволяйте детям играть с острыми предметами :) –

+0

Интересно - забыл этот трюк. –

1

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

Предполагая, что вы имели в виду ввести

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

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

struct tm { 
    int x; 
    char y; 
} 

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

struct tm { 
    char y; 
    int x; 
} 
+4

Nope: 'sizeof (struct)' не является законным. 'sizeof (struct st)' is. –

+0

Вы имеете в виду 'struct st * x = malloc (sizeof (struct st));' сама структура на самом деле не имеет размера. –

+0

Извините - снятое чтение op. Я сосредоточился на них, спрашивая, является ли sizeof (любая структура) законным –

4

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

4

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

1

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

+2

Не бросайте' malloc() ': 1. Это не нужно (C void * отличается от C++ void *), 2. Инструменты анализа, подобранные линией, могут обнаружить, что malloc() не соответствует размеру , и 3. включая правильный заголовок даст компилятору правильные намеки, что вы имеете в виду * system * malloc, что может привести к улучшению кода. – geocar

-1

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

В общем,

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

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

+0

AFAIK в C нет такой вещи, как структуры с переменным размером или абстрактные структуры (вы можете подделывать их, но они не поддерживаются на уровне языка); единственный случай, когда компилятор скажет вам, что он не знает размер структуры, когда структура объявлена, но не определена (полезно, если в текущем блоке компиляции вы просто обрабатываете указатели на структуру). –

Смежные вопросы