2012-04-04 2 views
3

약간의 연구를했지만 명확한 승인이나 거부를 찾을 수 없습니다.가변 길이 데이터와 길이가 0 인 배열의 이진 직렬화는 안전합니까?

내가 원하는 것은 고정 크기 구조 + 가변 길이 부분이므로 직렬화를 간단하고 오류가 발생하지 않는 방식으로 표현할 수 있습니다.

struct serialized_data 
{ 
    int len; 
    int type; 
    char variable_length_text[0]; 
}; 

: 그리고 MSVC, GCC는 등 그 소리는, 그것으로 확인하는 경우

serialize_data buff = (serialize_data*)malloc(sizeof(serialize_data)+5); 
buff->len=5; 
buff->type=1; 
memcpy(buff->variable_length_text, "abcd", 5); 

불행하게도 내가 찾을 수 없습니다.

어쩌면 동일한 것을 달성하는 더 좋은 방법이 있을까요?

은 정말 모든 주위 사람들 추한 캐스트를하지 않으려는이 프로그램 길이가 0 인 배열을 사용

memcpy((char*)(((char*)buffer)+sizeof(serialize_data)), "abcd", 5); 
+1

이다. – ildjarn

+4

언어를 선택하십시오. C++ 또는 C에 관심이 있습니까? –

+1

이 기사가 유용 할 것입니다. 이식성 질문에 대답하지 않지만이 패턴에 대한 통찰력을 제공합니다. http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx – JaredPar

답변

2

. 이것은 C가 아니라 GNU 확장입니다.

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

C89에서 흔한 관용구는, 상기 는 구조체 해킹라는 사용 하였다 :

struct serialized_data 
{ 
    int len; 
    int type; 
    char variable_length_text[1]; 
}; 

불행히도 플렉시블 어레이로서의 일반적인 사용은 엄격히 따르지 않는 것이다.

C99는 동일한 작업을 수행하는 것과 비슷합니다. 이라는 유연한 배열 구성원이라는 기능. `있지만 예 반드시 동일한 달성하기위한 더 나은 방법이있다; 여기서 '[1] 숯 variable_length_text되어야 오른쪽 규격 (C99, 6.7.2.1p17)로부터 예

struct s { int n; double d[]; }; 
int m = 12; // some value 
struct s *p = malloc(sizeof (struct s) + sizeof (double [m])); 
+0

C99 방식으로 MSVC7/8/9, GCC 및 Clang에서 작동 할 수 있습니까? – Coder

+0

C99는 gcc와 clang이 지원하지만 MSVC는 지원하지 않습니다. struct hack은 엄격하게 준수하지는 않지만 꽤 일반적이며 C89 컴파일러에서 고려해야합니다. – ouah