문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문
Visual Studio 2017을 사용하는 것이 좋습니다.

구조체에서 크기를 지정하지 않은 배열

Microsoft 확장에서는 C 또는 C++ 구조체 또는 클래스의 마지막 멤버가 가변 크기의 배열일 수 있습니다. 이러한 멤버를 크기가 지정되지 않은 배열이라고 합니다. 구조체 끝에서 크기가 지정되지 않은 배열을 사용하면 가변 크기의 문자열이나 다른 배열을 추가할 수 있으므로 포인터 역참조의 런타임 실행 비용을 방지할 수 있습니다.

// unsized_arrays_in_structures1.cpp
// compile with: /c
struct PERSON {
   unsigned number;
   char name[];   // Unsized array
};

sizeof 연산자를 이 구조체에 적용하는 경우 끝의 배열 크기는 0으로 간주됩니다. 이 구조체의 크기는 부호 없는 멤버의 크기인 2바이트입니다. PERSON 형식의 변수에 대한 실제 크기를 얻으려면 배열 크기를 별도로 얻어야 합니다.

구조체의 크기를 배열 크기에 더하여 할당될 전체 크기를 얻을 수 있습니다. 할당 후 다음과 같이 배열이 구조체의 배열 멤버에 복사됩니다.

// unsized_arrays_in_structures2.cpp
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

enum {
   sizeOfBuffer = 40
};

struct PERSON {
   unsigned number;
   char name[];   // Unsized array
};

int main() {
   char szWho[sizeOfBuffer];
   PERSON *ptrPerson = NULL;

   printf_s( "Enter name: " );
   gets_s( szWho, sizeOfBuffer );
 
   // Allocate space for structure, name, and terminating null
   ptrPerson = (PERSON *)malloc( sizeof( struct PERSON ) 
                           + strlen( szWho ) + 1 );

   // Copy the string to the name member
   strcpy_s( ptrPerson->name, sizeOfBuffer, szWho );
}
John

구조체 변수의 배열이 초기화된 후에도 sizeof 연산자는 배열 없이 변수의 크기를 반환합니다.

크기가 지정되지 않은 배열이 포함된 구조체는 초기화될 수 있지만 이러한 구조체의 배열은 초기화될 수 없습니다.

struct PERSON me  = { 6, "Me" };        // Legal
struct PERSON you = { 7, "You" };

struct PERSON us[2] = { { 8, "Them" },  // Error
                        { 9, "We" } };

문자열 리터럴을 사용하여 초기화된 문자의 배열에는 종료 null을 위한 공간이 제공되지만, 개별 문자를 사용하여 초기화된 배열(예: {'a', ' b', 'c'})에는 제공되지 않습니다.

크기가 지정되지 않은 배열이 포함된 구조체는 바깥쪽 구조체에서 마지막 멤버로 선언된 경우 다른 구조체에 나타날 수 있습니다. 크기가 지정되지 않은 배열이 포함된 클래스 또는 구조체에는 직접 또는 간접 가상 기본이 있을 수 없습니다.

관련 내용은 volatile#define을 참조하십시오.

표시: