Очень часто malloc() абсолютно не допускается при программировании для встроенных систем. Большую часть времени я могу справиться с этим, но меня раздражает одно: это мешает мне использовать так называемые "непрозрачные типы", чтобы обеспечить скрытие данных. Обычно я делал бы что-то вроде этого:
// In file module.h
typedef struct handle_t handle_t;
handle_t *create_handle();
void operation_on_handle(handle_t *handle, int an_argument);
void another_operation_on_handle(handle_t *handle, char etcetera);
void close_handle(handle_t *handle);
// In file module.c
struct handle_t {
int foo;
void *something;
int another_implementation_detail;
};
handle_t *create_handle() {
handle_t *handle = malloc(sizeof(struct handle_t));
// other initialization
return handle;
}
Там вы идете: create_handle() выполняет malloc(), чтобы создать "экземпляр". Конструкция, часто используемая для предотвращения использования malloc(), заключается в изменении прототипа create_handle() следующим образом:
void create_handle(handle_t *handle);
И тогда вызывающий может создать дескриптор таким образом:
// In file caller.c
void i_am_the_caller() {
handle_t a_handle; // Allocate a handle on the stack instead of malloc()
create_handle(&a_handle);
// ... a_handle is ready to go!
}
Но, к сожалению, этот код явно недействителен, размер handle_t неизвестен!
Я никогда не нашел решения, чтобы решить это правильно. Мне очень хотелось бы знать, есть ли у кого-то подходящий способ сделать это, или, может быть, совсем другой подход, позволяющий скрывать данные на C (не используя статические глобальные переменные в модуле .c, конечно, нужно иметь возможность создавать несколько экземпляров).