
In the C programming language, struct is the keyword used to define a composite, a.k.a. record, data type – a named set of values that occupy a block of memory. It allows for the different values to be accessed via a single identifier, often a pointer. A struct can contain other data types so is used for mixed-data-type records. For example a bank customer struct might contains fields: name, address, telephone, balance.
A struct occupies a contiguous block of memory, usually delimited (sized) by word-length boundaries. It corresponds to the similarly named feature available in some assemblers for Intel processors. Being a block of contiguous memory, each field within a struct is located at a certain fixed offset from the start.
The sizeof operator results in the number of bytes needed to store a particular struct, just as it does for a primitive data type. The alignment of particular fields in the struct (with respect to word boundaries) is implementation-specific and may include padding. Modern compilers typically support the #pragma pack
directive, which sets the size in bytes for alignment.
The C struct feature was derived from the same-named concept in ALGOL 68.
Declaration
The syntax for a struct declaration is shown by this simple example:
struct tag_name { type member1; type member2; };
The tag_name
is optional in some contexts.
Typedef
Via the keyword typedef
, a struct type can be referenced without using the struct
keyword. However, some[who?] programming style guides advise against this, claiming that it can obfuscate the type.
For example:
typedef struct tag_name { type member1; type member2; } thing_t; thing_t thing;
In C++ code, typedef is not needed because types defined via struct
are part of the regular namespace, so the type can be referred to as either struct thing_t
or thing_t
.
Initialization
There are three ways to initialize a structure.
For the type:
struct point_t { int x; int y; };
C89-style initializers are used when contiguous members may be given. For example:
struct point_t a = { 1, 2 };
For non contiguous or out of order members list, designated initializer style may be used. For example:
struct point_t a = { .y = 2, .x = 1 };
If an initializer is given or if the object is statically allocated, omitted elements are initialized to 0.
A third way of initializing a structure is to copy the value of an existing object of the same type. For example:
struct point_t b = a;
Copy
The state of a struct can be copied to another instance. A compiler might use memcpy()
to copy the bytes of the memory block.
struct point_t a = { 1, 3 }; struct point_t b; b = a;
Pointers
Pointers can be used to refer to a struct
by its address. This is useful for passing a struct to a function to avoid the overhead of copying the struct. The ->
operator dereferences the pointer (left operand) and accesses the value of a struct member (right operand).
struct point_t point = { 3, 7 }; int x = point.x; point.x = 10; struct point_t *pp = &point; x = pp->x; pp->x = 8;
In other languages
C++
In C++, struct is essentially the same as for C. Further, a class is the same as a struct but with different default visibility: class members are private by default, whereas struct members are public by default.
.NET
.NET languages have a feature similar to struct in C – called struct
in C# and Structure
in Visual Basic .NET). This construct provides many features of a class, but acts as a value type instead of a reference type. For example, when passing a .NET struct to a function, the value is copied so that changes to the input parameter do not affect the value passed in.
See also
- Bit field – Data structure that maps one or more adjacent bits
- Flexible array member – C language feature in which a struct may contain as its last member an array with no specified size
- Passive data structure – Another term for record
- Union type – Data type that allows for values that are one of multiple different data types
References
- "Struct memory layout in C". Stack Overflow.
- Ritchie, Dennis M. (March 1993). "The Development of the C Language". ACM SIGPLAN Notices. 28 (3): 201–208. doi:10.1145/155360.155580.
The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of. The central notion I captured from Algol was a type structure based on atomic types (including structures), composed into arrays, pointers (references), and functions (procedures). Algol 68's concept of unions and casts also had an influence that appeared later.
- Kelley, Al; Pohl, Ira (2004). A Book On C: Programming in C (Fourth ed.). pp. 418. ISBN 0-201-18399-4.
- "IBM Linux compilers. Initialization of structures and unions".
- "Parameter passing in C#".
In the C programming language struct is the keyword used to define a composite a k a record data type a named set of values that occupy a block of memory It allows for the different values to be accessed via a single identifier often a pointer A struct can contain other data types so is used for mixed data type records For example a bank customer struct might contains fields name address telephone balance A struct occupies a contiguous block of memory usually delimited sized by word length boundaries It corresponds to the similarly named feature available in some assemblers for Intel processors Being a block of contiguous memory each field within a struct is located at a certain fixed offset from the start The sizeof operator results in the number of bytes needed to store a particular struct just as it does for a primitive data type The alignment of particular fields in the struct with respect to word boundaries is implementation specific and may include padding Modern compilers typically support the pragma pack directive which sets the size in bytes for alignment The C struct feature was derived from the same named concept in ALGOL 68 DeclarationThe syntax for a struct declaration is shown by this simple example struct tag name type member1 type member2 The tag name is optional in some contexts TypedefVia the keyword typedef a struct type can be referenced without using the struct keyword However some who programming style guides advise against this claiming that it can obfuscate the type For example typedef struct tag name type member1 type member2 thing t thing t thing In C code typedef is not needed because types defined via struct are part of the regular namespace so the type can be referred to as either struct thing t or thing t InitializationThere are three ways to initialize a structure For the type struct point t int x int y C89 style initializers are used when contiguous members may be given For example struct point t a 1 2 For non contiguous or out of order members list designated initializer style may be used For example struct point t a y 2 x 1 If an initializer is given or if the object is statically allocated omitted elements are initialized to 0 A third way of initializing a structure is to copy the value of an existing object of the same type For example struct point t b a CopyThe state of a struct can be copied to another instance A compiler might use memcpy to copy the bytes of the memory block struct point t a 1 3 struct point t b b a PointersPointers can be used to refer to a struct by its address This is useful for passing a struct to a function to avoid the overhead of copying the struct The gt operator dereferences the pointer left operand and accesses the value of a struct member right operand struct point t point 3 7 int x point x point x 10 struct point t pp amp point x pp gt x pp gt x 8 In other languagesC In C struct is essentially the same as for C Further a class is the same as a struct but with different default visibility class members are private by default whereas struct members are public by default NET NET languages have a feature similar to struct in C called struct in C and Structure in Visual Basic NET This construct provides many features of a class but acts as a value type instead of a reference type For example when passing a NET struct to a function the value is copied so that changes to the input parameter do not affect the value passed in See alsoBit field Data structure that maps one or more adjacent bits Flexible array member C language feature in which a struct may contain as its last member an array with no specified size Passive data structure Another term for record Union type Data type that allows for values that are one of multiple different data typesReferences Struct memory layout in C Stack Overflow Ritchie Dennis M March 1993 The Development of the C Language ACM SIGPLAN Notices 28 3 201 208 doi 10 1145 155360 155580 The scheme of type composition adopted by C owes considerable debt to Algol 68 although it did not perhaps emerge in a form that Algol s adherents would approve of The central notion I captured from Algol was a type structure based on atomic types including structures composed into arrays pointers references and functions procedures Algol 68 s concept of unions and casts also had an influence that appeared later Kelley Al Pohl Ira 2004 A Book On C Programming in C Fourth ed pp 418 ISBN 0 201 18399 4 IBM Linux compilers Initialization of structures and unions Parameter passing in C