Struct (C programming language)
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 contain fields for the customer's name, address, telephone number, and balance.
A struct occupies a contiguous block of memory, usually delimited 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 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 TagName ;
The
TagName is optional in some contexts.Typedef
Via the keywordtypedef, a struct type can be referenced without using the struct keyword. However, some programming style guides advise against this, claiming that it can obfuscate the type.For example:
typedef struct TagName Thing;
// struct TagName can now be referred to as Thing
Thing 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 or Thing. typedef in C++ is also superseded by the using statement, which can alias types that have templates.Initialization
Considering the struct declaration:struct Point ;
There are three ways to initialize a structure:
C89-style initializers are used when contiguous members may be given. For example:
struct Point a = ;
For non contiguous or out of order members list, designated initializer style may be used. For example:
struct Point a = ;
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 b = a;
Copy
The state of a struct can be copied to another instance. A compiler might usememcpy to copy the bytes of the memory block.struct Point a = ;
struct Point b;
b = a;
Pointers
Pointers can be used to refer to astruct 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 and accesses the value of a struct member.struct Point p = ;
int x = p.x;
p.x = 10;
struct Point* pp = &p;
x = pp->x;
pp->x = 8;
In other languages
D, Go, Julia, Rust, Swift and Zig 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 calledstruct 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.