Struct (C programming language)
Template:Short description Template:Lowercase In the C programming language, struct is the keyword used to define a composite, a.k.a. record, data type Template:Endash 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 contain fields for the customer's name, address, telephone number, and 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.<ref>{{#invoke:citation/CS1|citation
|CitationClass=web
}}</ref>
The C struct feature was derived from the same-named concept in ALGOL 68.<ref name="sigplan">Template:Cite journal</ref>
Declaration
The syntax for a struct declaration is shown by this simple example:
<syntaxhighlight lang="C"> struct TagName {
Type member1; Type member2;
}; </syntaxhighlight>
The TagName is optional in some contexts.
Typedef
Via the keyword typedef, a struct type can be referenced without using the struct keyword. However, some<ref>{{#invoke:citation/CS1|citation
|CitationClass=web
}}</ref> programming style guides advise against this, claiming that it can obfuscate the type.
For example: <syntaxhighlight lang="C"> typedef struct TagName {
Type member1; Type member2;
} Thing;
// struct TagName can now be referred to as Thing Thing thing; </syntaxhighlight>
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 or Thing. typedef in C++ is also superseded by the using statement, which can alias types that have templates.
Initialization
There are three ways to initialize a structure.
For the type:
<syntaxhighlight lang="c"> struct Point {
int x; int y;
}; </syntaxhighlight>
C89-style initializers are used when contiguous members may be given.<ref>Template:Cite book</ref> For example:
<syntaxhighlight lang="c"> struct Point a = { 1, 2 }; </syntaxhighlight>
For non contiguous or out of order members list, designated initializer style may be used.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> For example:
<syntaxhighlight lang="c"> struct Point a = { .y = 2, .x = 1 }; </syntaxhighlight>
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:
<syntaxhighlight lang="c"> struct Point b = a; </syntaxhighlight>
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.
<syntaxhighlight lang="c"> struct Point a = { 1, 3 }; struct Point b; b = a; </syntaxhighlight>
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).
<syntaxhighlight lang="c"> struct Point p = { 3, 7 }; int x = p.x; p.x = 10; struct Point* pp = &p; x = pp->x; pp->x = 8; </syntaxhighlight>
In other languages
D,<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> Go, Julia,<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> Rust, Swift and Zig<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> have structs.
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 Template:Endash 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.<ref>{{#invoke:citation/CS1|citation
|CitationClass=web
}}</ref>