# C Programming/Structs

* Objective
* Learn about structs and how to use them.
* Declaring structs.
* Defining structs.
* Lesson
* Introduction
* Structures allow objects of different types to be stored within one object. Let's say that you want to store a car's colour, maximum speed and registration number. We can define a structure that includes all that information.
* First, include the header files required for printf and strcpy:
* #include <stdio.h>
* #include <string.h>
* Define the structure:
* struct car
* unsigned int colour;
* unsigned int max_speed;
* char reg_num[10];
* Example of the structure being used:
* int main(void)
* /* define two car objects */
* struct car car_1, car_2;
* car_1.colour = 1; /* initialize car_1's colour */
* car_1.max_speed = 200; /* initialize car_1's speed */
* /* initialize the reg number */
* strcpy(car_1.reg_num, "MG 100");
* /* copy car_1 data to car_2 */
* car_2 = car_1;
* /* print the values */
* printf("Colour = %u\n", car_2.colour);
* printf("Speed = %u\n", car_2.max_speed);
* printf("Reg = %s\n", car_2.reg_num);
* return 0;
* Dynamic Structures
* Along with being static, structures can also be dynamic. This means that they can be created and deleted at run time. An example is given below.
* #include <stdio.h>
* // This is a basic dog structure.
* struct dog
* char *name;
* char *breed;
* char *coat;
* int age;
* // Describes the dog.
* void describe(struct dog *d)
* printf("This is a %s dog. The %s's name is %s. %s has a nice %s coat. %s is %d years old.\n\n",
* d->breed, d->breed, d->name, d->name, d->coat, d->name, d->age);
* int main(void)
* // Allocate memory for all of the dogs.
* // Notice that size for malloc is struct dog and it's casted as struct dog*.
* struct dog *dog1 = (struct dog*) malloc(sizeof(struct dog));
* struct dog *dog2 = (struct dog*) malloc(sizeof(struct dog));
* struct dog *dog3 = (struct dog*) malloc(sizeof(struct dog));
* // Give the dogs some personality.
* dog1->name = "Foxtrot";
* dog1->breed = "American Eskimo";
* dog1->coat = "white";
* dog1->age = 6;
* dog2->name = "Delta";
* dog2->breed = "German Shepherd";
* dog2->coat = "tan with a black saddle";
* dog2->age = 3;
* dog3->name = "Whiskey";
* dog3->breed = "Tamaskan";
* dog3->coat = "wolf grey";
* dog3->age = 2;
* // Tell the user about each dog.
* describe(dog1);
* describe(dog2);
* describe(dog3);
* // Free the allocated memory.
* free(dog1);
* free(dog2);
* free(dog3);
* return 0;
* OUTPUT
* This is a American Eskimo dog. The American Eskimo's name is Foxtrot. Foxtrot has a nice white coat. Foxtrot is 6 years old.
* This is a German Shepherd dog. The German Shepherd's name is Delta. Delta has a nice tan with a black saddle coat. Delta is 3 years old.
* This is a Tamaskan dog. The Tamaskan's name is Whiskey. Whiskey has a nice wolf grey coat. Whiskey is 2 years old.
* It is now possible to do dynamic things with each dog structure, although those operations could be a little advanced. Also notice the use of the arrow operator (->). This is a cleaner way of using pointers when working with structures. For example dog1->name is equal to *(dog1).name. The arrow operator makes it easier when accessing nested structures.
* Assignments
Completion status: Almost complete, but you can help make it more thorough.
Previous Lesson: Strings
Next Lesson: Input and Output
Course Home Page :