struct (C programming language)

{{Short description|C keyword for defining a structured data type}}

{{lowercase}}

In the C programming language, struct is the keyword used to define a composite, a.k.a. record, data type {{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 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.{{Cite web|url=https://stackoverflow.com/questions/2748995/struct-memory-layout-in-c|title=Struct memory layout in C|website=Stack Overflow}}

The C struct feature was derived from the same-named concept in ALGOL 68.{{cite journal | first = Dennis M.| last = Ritchie | authorlink = Dennis Ritchie | title = The Development of the C Language | date = March 1993 | journal = ACM SIGPLAN Notices | volume = 28 | issue = 3 | pages = 201–208 | url = http://www.bell-labs.com/usr/dmr/www/chist.html | doi = 10.1145/155360.155580 | quote = 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.| doi-access = free }}

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|date=October 2021}} 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.{{cite book | first1 = Al | last1 = Kelley | first2 = Ira | last2 = Pohl | year = 2004 | url = https://archive.org/details/bookoncprogrammi00kell/page/418 | edition = Fourth | title = A Book On C: Programming in C | isbn = 0-201-18399-4 | pages = [https://archive.org/details/bookoncprogrammi00kell/page/418 418] | url-access = registration }} For example:

struct point_t a = { 1, 2 };

For non contiguous or out of order members list, designated initializer style may be used.{{cite web | url=https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/strin.htm | title=IBM Linux compilers. Initialization of structures and unions}} 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 {{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.{{Cite web|url=http://yoda.arachsys.com/csharp/parameters.html|title=Parameter passing in C#}}

See also

  • {{Annotated link|Bit field}}
  • {{Annotated link|Flexible array member}}
  • {{Annotated link|Passive data structure}}
  • {{Annotated link|Union type}}

References