Подтвердить что ты не робот

Выделение памяти для структуры в C

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

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

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

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

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

4b9b3361

Ответ 1

Мой любимый:

#include <stdlib.h>

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

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

struct tm {
  int x;
  char y;
}

может иметь разный размер для

struct tm {
  char y;
  int x;
}

Ответ 6

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

Ответ 7

Я считаю, что когда вы вызываете 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 версию структуры, которую вы хотите.