2016-09-08 14 views
-3

는 I는 다음의 구조를 가지고런타임시 데이터 유형 롤오버 전에 허용되는 최대 값을 계산하는 방법은 무엇입니까?

struct Some_Struct { 
    uint32_t a; 
    int16_t b; 
    uint8_t c; 
}; 

struct Other_Struct { 
    uint32_t a; 
    uint32_t b; 
    uint32_t c; 
}; 

가변 크기와 같은 계산되고 :

uint32_t size = sizeof(Some_Struct) + sizeof(Other_Struct) * n;

질문하기, sizeof Some_Struct 및 그 실제 크기에 의존 Other_Struct 주어진다 플랫폼, 아키텍처 및 패킹의 경우 이 롤오버되기 전에 런타임에 최대 n의 최대 수를 어떻게 결정할 수 있습니까?

+3

을 "[0] 정의되지 지정한다." - 그건 정확하지 않습니다. _flexible 배열 member_ :'Other_Struct e []'를 사용하십시오. 그''[1]'해킹은 유산이며 현대 C에서 정의되지 않은 행동을 불러옵니다. – Olaf

+0

이것은 C99에서만 지원됩니다. 태그가 붙은 C++도 유연한 배열 멤버를 지원하지 않습니다. – Zhro

+3

위의 노트에서 나는 질문을 다시 할 시간이 왔다고 생각한다. 이것은'c' 또는'C++ '인가? 그들은 같은 언어가 아니며 동일한 대답을 가지지 않을 것입니다. –

답변

0

당신은 numeric_limits 사용할 수 있습니다

uint32_t maximum_n = (std::numeric_limits<uint32_t>::max() - sizeof(Some_Struct)) 
           /sizeof(Other_Struct); 
+0

'uint32_t maximum_n = (std :: numeric_limits :: max() - sizeof (Some_Struct)) /sizeof (Other_Struct); ' – Zhro

+0

아, 맞아 - 방정식을 잘못 이해했다. 나는 당신에게'sizeof' 주위에 괄호가 있다고 생각했습니다. – villapx

+0

일치하도록 수정 됨 – villapx