2014-10-17 2 views
-3
struct Flat { 
    int a1; 
    int a2; 
} 
// a hierarchical struct which containing a struct attribute 
struct NonFlat { 
    Flat b1; 
    int b2; 
} 

Flat f1, f2; 
memcmp (&f1, &f2, sizeof f1) 

그것이memcmp가 non-flat 구조체에서 작동합니까? 제 컴파일러

f1.a1 의미 작동 == f2.a1, f1.a2 == f2.a2 < => memcmp는 (F1, F2) == 0;

NonFlat n1, n2; 
memcmp (&n1, &n2, sizeof n1) // does it also work for non-flat structs, considering the padding?  

또한 NonFlat 구조체에서도 작동해야한다고 가정합니다. 그러나, 내 컴파일러에서 평평하지 않은 구조체의 경우 멤버 특성이 동일하더라도 memcmp의 결과가 다르다는 것을 나타냅니다.

+4

"그것이 효과가있다"는 것은 그것이 당신이 생각하는 것을 의미하지는 않습니다. –

+4

귀하의 구조는 꽤 평평 해 보입니다. – juanchopanza

+1

컴포지션을 사용할 때 구조가 "평면"입니다. 집계를 사용할 때 그렇지 않습니다. 당신의'Flat'과'NonFlat' 구조는 모두 합성을 사용하고 있기 때문에 "평평"합니다. –

답변

4

구조는 평면입니다.

평평하지 않은 구조에는 포인터가 있습니다.

또한 이러한 구조를 초기화하지 않았습니다.

5

C 라이브러리 함수 memcmp은 메모리 위치를 바이트 단위로 비교합니다. @MSalters가 올바르게 지적했듯이이 비교에는 모든 패딩 바이트가 포함됩니다.

구조물이 평평한 지 또는 평평하지 않은 지에 상관없이 구조물은 평평한 지 또는 평평하지 않은지 상관하지 않습니다. 구조 의미론에 대해 신경 쓰지도 않으며 알지도 못합니다.

바이트가 동일하면 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

멤버가 메모리에 연속적으로 배치 된 구조의 경우 모든 필드가 일치하면 일치하는 것입니다. 메모리에있는 다른 위치에 대한 포인터가있는 구조체의 경우 포인터가 가리키는 메모리가 일치하는지 확인하기 위해 해당 포인터를 따르지 않고 대신 포인터에 저장된 문자 주소 만보고 일치하는지 확인합니다.

+0

참고 : 여기에는 ** 채우기 ** 바이트가 포함됩니다. – MSalters

+0

@MSalters, 포인터 주셔서 감사합니다. 나는 그 대답을 편집했다. – merlin2011

+0

주 : 1)'size == 0'의 경우, memcmp()는 0을 반환합니다. 2) 바이트가 모두 같으면 0을 반환합니다. 보통 0은 false로 간주합니다. – chux