임베디드 시스템을 프로그래밍 할 때 매우 자주 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에서 데이터 숨기기를 가능하게하는 완전히 다른 접근법을 알고 있는지 알고 싶다. 물론 모듈의 정적 전역을 사용하지 않는다. 물론 하나의 인스턴스를 여러 개 만들 수 있어야한다.).
아마도 뭔가를 놓치고 있습니다. handle_t의 크기가 알려지지 않은 이유는 무엇입니까? "create_handle"은 "handlet_t *"유형의 인수를 취하므로 크기에 대한 지식을 가져야합니다. 배열을 통과하면 다른 문제가 될 것이라고 생각합니다. – onemasse
@onemasse handle_t의 크기는 caller.c에 알려지지 않으며 handle_t에 대한 포인터 만 사용할 수 있습니다. handle_t의 크기는 module.c에서만 알 수 있습니다. – Bart
@onemasse 전달 선언 및 포인터는 불투명 유형을 사용할 수 있으므로 구현이 클라이언트가 아닌 크기를 알 수 있습니다. – Ioan