c언어 sizeof 예제

By agosto 2, 2019Sem categoria

sizeof는 “완전히” 정의된 형식에만 적용할 수 있습니다. 배열을 사용하면 배열의 차원이 해당 선언에 있어야 하며 요소 형식을 완전히 정의해야 합니다. 구조체 및 공용 구조체의 경우 완전히 정의된 형식의 멤버 목록이 있어야 합니다. 예를 들어, 다음 두 소스 파일을 고려해 보십시오: stddef.h와 같은 특정 표준 헤더 파일은 sizeof 식 결과의 서명되지 않은 정수 유형을 나타내기 위해 size_t를 정의합니다. printf 너비 지정자 z는 해당 형식의 서식을 지정하기 위한 것입니다. 식의 형식이 VLA인 경우를 제외하고,(C99 이후) 식은 평가되지 않으며 sizeof 연산자는 정수 상수 식에서 사용될 수 있다. 고정 길이 데이터 형식 또는 변수에 적용하면 프로그램 컴파일 중에 연산자 sizeof가 있는 식이 평가됩니다. 상수 결과 값으로 바뀝습니다. C99 표준에는 프로그램 실행 중에 이러한 식에 대한 평가가 필요한 가변 길이 배열(VLA)이 도입되었습니다. 대부분의 경우 구현 세부 사항은 컴파일러가 준수해야 하는 데이터 형식에 대한 형식, 패딩 및 정렬을 지정하는 플랫폼의 응용 프로그램 이진 인터페이스(ABI) 문서에 문서화될 수 있습니다. 사용 sizeof() 연산자는 나연화 유형에 따라 다른 방식으로 사용됩니다. 배열 식별자에 sizeof 연산자를 적용하면 배열 식별자로 표시되는 포인터 크기가 아니라 전체 배열의 크기가 됩니다.

크기 연산자에서 x 값을 20씩 증분하고 있지만 컴파일러sizeof(x=x+20)를 배열 이름에 적용할 때와 같이 결과 2로 대체하기 때문에 x값이 변경되지 않는 것으로 관찰됩니다. 결과는 전체 배열을 저장하는 데 필요한 바이트 수입니다. 이는 배열의 이름이 배열의 첫 번째 요소에 대한 포인터로 변환되는 규칙에 대한 몇 가지 예외 중 하나이며, 실제 배열 크기가 컴파일 타임에 고정되고 알려져 있기 때문에 sizeof 연산자가 평가될 때 가능합니다. 다음 프로그램은 sizeof를 사용하여 선언된 배열의 크기를 결정하여 문자를 복사할 때 버퍼 오버플로를 피합니다. 효율성 또는 아키텍처 제약 이 있습니다. 많은 컴퓨터 아키텍처는 단어 크기의 배수가 아닌 바이트 주소에서 시작하여 다중 바이트 액세스를 지원하지 않으며, 아키텍처에서 허용하는 경우에도 일반적으로 프로세서는 단어 정렬 된 개체를 가져올 수있는 것보다 더 빨리 단어 정렬 된 개체를 가져올 수 있습니다. 메모리에 여러 단어를 스트래들합니다. [4] 따라서 컴파일러는 일반적으로 데이터 구조를 적어도 단어 경계에 정렬하고 개별 멤버를 해당 경계에 정렬합니다.