HOME

TheInfoList



OR:

A struct in the
C programming language ''The C Programming Language'' (sometimes termed ''K&R'', after its authors' initials) is a computer programming book written by Brian Kernighan and Dennis Ritchie, the latter of whom originally designed and implemented the language, as well a ...
(and many derivatives) is a composite data type (or record) declaration that defines a physically grouped list of variables under one name in a block of memory, allowing the different variables to be accessed via a single pointer or by the struct declared name which returns the same address. The struct data type can contain other data types so is used for mixed-data-type records such as a hard-drive directory entry (file length, name, extension, physical address, etc.), or other mixed-type records (name, address, telephone, balance, etc.). The C struct directly references a ''contiguous block'' of physical 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. Because the contents of a struct are stored in contiguous memory, the sizeof operator must be used to get the number of bytes needed to store a particular type of struct, just as it can be used for primitives. The alignment of particular fields in the struct (with respect to
word A word is a basic element of language that carries an objective or practical meaning, can be used on its own, and is uninterruptible. Despite the fact that language speakers often have an intuitive grasp of what a word is, there is no conse ...
boundaries) is implementation-specific and may include padding, although modern compilers typically support the #pragma pack directive, which changes the size in bytes used for alignment. In the C++ language, a struct is identical to a C++ class but has a different default visibility: class members are private by default, whereas struct members are public by default.


In other languages

The struct data type in C was derived from the
ALGOL 68 ALGOL 68 (short for ''Algorithmic Language 1968'') is an imperative programming language that was conceived as a successor to the ALGOL 60 programming language, designed with the goal of a much wider scope of application and more rigorously d ...
struct data type. Like its C counterpart, the struct data type in C# (''Structure'' in
Visual Basic .NET Visual Basic, originally called Visual Basic .NET (VB.NET), is a multi-paradigm, object-oriented programming language, implemented on .NET, Mono, and the .NET Framework. Microsoft launched VB.NET in 2002 as the successor to its original Visua ...
) is similar to a
class Class or The Class may refer to: Common uses not otherwise categorized * Class (biology), a taxonomic rank * Class (knowledge representation), a collection of individuals or objects * Class (philosophy), an analytical concept used differently ...
. The biggest difference between a struct and a class in these languages is that when a struct is passed as an argument to a function, any modifications to the struct in that function will not be reflected in the original variable (unless pass-by-reference is used). This differs from C++, where classes or structs can be statically allocated or dynamically allocated either on the stack (similar to C#) or on the heap, with an explicit pointer. In C++, the only difference between a struct and a
class Class or The Class may refer to: Common uses not otherwise categorized * Class (biology), a taxonomic rank * Class (knowledge representation), a collection of individuals or objects * Class (philosophy), an analytical concept used differently ...
is that the members and base classes of a struct are
public In public relations and communication science, publics are groups of individual people, and the public (a.k.a. the general public) is the totality of such groupings. This is a different concept to the sociology, sociological concept of the ''Öf ...
by default. (A class defined with the class keyword has
private Private or privates may refer to: Music * " In Private", by Dusty Springfield from the 1990 album ''Reputation'' * Private (band), a Denmark-based band * "Private" (Ryōko Hirosue song), from the 1999 album ''Private'', written and also recorde ...
members and base classes by default.)


Declaration

The general syntax for a struct declaration in C is: struct tag_name ; Here tag_name is optional in some contexts. Such a struct declaration may also appear in the context of a
typedef typedef is a reserved keyword in the programming languages C, C++, and Objective-C. It is used to create an additional name (''alias'') for another data type, but does not create a new type, except in the obscure case of a qualified typedef of ...
declaration of a type alias or the declaration or definition of a variable: typedef struct tag_name struct_alias;


Initialization

There are three ways to initialize a structure. For the struct type /* Declare the struct with integer members x, y */ struct point ; ''C89-style initializers'' are used when contiguous members may be given. /* Define a variable p of type point, and initialize its first two members in place */ struct point p = ; For non contiguous or out of order members list, ''designated initializer'' style may be used /* Define a variable p of type point, and set members using designated initializers */ struct point p = ; 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 /* Define a variable q of type point, and set members to the same values as those of p */ struct point q = p;


Assignment

A struct may be assigned to another struct. A compiler might use memcpy() to perform such an assignment. struct point ; int main(void)


Pointers to struct

Pointers can be used to refer to a struct by its address. This is useful for passing structs to a function. The pointer can be dereferenced using the * operator. The -> operator dereferences the pointer to struct (left operand) and then accesses the value of a member of the struct (right operand). struct point ; struct point my_point = ; struct point *p = &my_point; /* p is a pointer to my_point */ (*p).x = 8; /* set the first member of the struct */ p->x = 8; /* equivalent method to set the first member of the struct */


See also

* Bit field * Flexible array member * Passive data structure * Union type


References

{{lowercase C (programming language)