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 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.[1]

The C struct feature was derived from the same-named concept in ALGOL 68.[2]

Declaration

edit

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

edit

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

edit

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.[3] For example:

struct point_t a = { 1, 2 };

For non contiguous or out of order members list, designated initializer style may be used.[4] 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

edit

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

edit

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

edit

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

edit

.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.[5]

See also

edit
  • 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

edit
  1. ^ "Struct memory layout in C". Stack Overflow.
  2. ^ 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.
  3. ^ Kelley, Al; Pohl, Ira (2004). A Book On C: Programming in C (Fourth ed.). pp. 418. ISBN 0-201-18399-4.
  4. ^ "IBM Linux compilers. Initialization of structures and unions".
  5. ^ "Parameter passing in C#".