Ответ 1
Мой любимый:
#include <stdlib.h>
struct st *x = malloc(sizeof *x);
Обратите внимание, что:
-
x
должен быть указателем - литье не требуется
- включить соответствующий заголовок
Мне поручено создать программу, которая динамически распределяет память для структуры. обычно мы будем использовать
x=malloc(sizeof(int)*y);
Однако, что я использую для структурной переменной? Я не думаю, что это возможно сделать
struct st x = malloc(sizeof(struct));
Может ли кто-нибудь помочь мне? Спасибо!
Мой любимый:
#include <stdlib.h>
struct st *x = malloc(sizeof *x);
Обратите внимание, что:
x
должен быть указателемТы не совсем так поступаешь. struct st x
- это структура, а не указатель. Это нормально, если вы хотите выделить один в стеке. Для выделения в куче struct st * x = malloc(sizeof(struct st));
.
struct st* x = malloc( sizeof( struct st ));
Это должно сделать:
struct st *x = malloc(sizeof *x);
Это точно можно сделать - и это правильный способ
Предполагая, что вы хотели набрать
struct st *x = malloc(sizeof(struct st));
пс. Вы должны делать sizeof (struct), даже если знаете размер всего содержимого, потому что компилятор может вычеркнуть структуру так, чтобы члены были выровнены.
struct tm {
int x;
char y;
}
может иметь разный размер для
struct tm {
char y;
int x;
}
struct st *x = (struct st *)malloc(sizeof(struct st));
Я считаю, что когда вы вызываете 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 версию структуры, которую вы хотите.