When nesting structures, the compiler needs to recognize the struct type you intend to use as a member. In the labs, first the inner struct will be defined, followed by defining the outer struct that contains the previously defined struct. This principle is also followed in the examples below. Alternatively, a forward declaration can be provided or the structs can be written physically nested already in the definition. You can look up those examples on your own if interested.
There are are total of three examples provided
- Using assignments to initialize the data in the structures (similarity to what you would do when prompting from the user).
- Using explicit initializing for the structure.
- Using compound literal to initialize the structure (supports re-initializing later in the code).
Example 1: AssignmentsExample 2: InitializingExample 3: Compound literal
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
/** * File: car_return.c * Author: Risto Heinsar * Created: 02.02.2015 * Modified 31.01.2025 * * Description: This is an example code showing creation of a nested struct */ #include <stdio.h> #include <string.h> #define REG_LEN 8 #define FIELD_LEN 32 struct Vehicle { char make[FIELD_LEN]; char model[FIELD_LEN]; }; struct CarRegistryEntry { char regNum[REG_LEN]; char regCity[FIELD_LEN]; char owner[FIELD_LEN]; int year; struct Vehicle car; }; void PrintCar(struct CarRegistryEntry motor); void PrintCarUsingPtr(struct CarRegistryEntry *car); int main(void) { struct CarRegistryEntry indestructibleHilux; strcpy(indestructibleHilux.regNum,"E473CJN"); strcpy(indestructibleHilux.regCity,"London"); strcpy(indestructibleHilux.owner,"The Stig"); indestructibleHilux.year = 1988; strcpy(indestructibleHilux.car.make,"Toyota"); strcpy(indestructibleHilux.car.model,"Hilux"); PrintCar(indestructibleHilux); PrintCarUsingPtr(&indestructibleHilux); return 0; } /** * Description: Outputs the details of an automobile using . notation * * Parameters: motor, vehicle structure with the details of a car * * Return: none */ void PrintCar(struct CarRegistryEntry motor) { printf("%s %s, reg number %s, belongs to %s and is registered in %s\n", motor.car.make, motor.car.model, motor.regNum, motor.owner, motor.regCity); } /** * Description: Outputs the details of an automobile using -> notation * * Parameters: motor, vehicle structure with the details of a car * * Return: none */ void PrintCarUsingPtr(struct CarRegistryEntry *motor) { printf("%s %s, reg number %s, belongs to %s and is registered in %s\n", motor->car.make, motor->car.model, motor->regNum, motor->owner, motor->regCity); } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
/** * File: car_return_init_struct.c * Author: Risto Heinsar * Created: 29.05.2026 * Modified 29.05.2026 * * Description: This is an example code showing creation of a nested struct. * * This example initializes all members explicitly */ #include <stdio.h> #include <string.h> #define REG_LEN 8 #define FIELD_LEN 32 struct Vehicle { char make[FIELD_LEN]; char model[FIELD_LEN]; }; struct CarRegistryEntry { char regNum[REG_LEN]; char regCity[FIELD_LEN]; char owner[FIELD_LEN]; int year; struct Vehicle car; }; void PrintCar(struct CarRegistryEntry motor); void PrintCarUsingPtr(struct CarRegistryEntry *car); int main(void) { struct CarRegistryEntry indestructibleHilux = {.regNum = "E473CJN", .regCity = "London", .owner = "The Stig", .year = 1988, .car.make = "Toyota", .car.model ="Hilux"}; PrintCar(indestructibleHilux); PrintCarUsingPtr(&indestructibleHilux); return 0; } /** * Description: Outputs the details of an automobile using . notation * * Parameters: motor, vehicle structure with the details of a car * * Return: none */ void PrintCar(struct CarRegistryEntry motor) { printf("%s %s, reg number %s, belongs to %s and is registered in %s\n", motor.car.make, motor.car.model, motor.regNum, motor.owner, motor.regCity); } /** * Description: Outputs the details of an automobile using -> notation * * Parameters: motor, vehicle structure with the details of a car * * Return: none */ void PrintCarUsingPtr(struct CarRegistryEntry *motor) { printf("%s %s, reg number %s, belongs to %s and is registered in %s\n", motor->car.make, motor->car.model, motor->regNum, motor->owner, motor->regCity); } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
/** * File: car_return_compound_literal.c * Author: Risto Heinsar * Created: 29.05.2026 * Modified 29.05.2026 * * Description: This is an example code showing creation of a nested struct. * * This example initializes all members explicitly */ #include <stdio.h> #include <string.h> #define REG_LEN 8 #define FIELD_LEN 32 struct Vehicle { char make[FIELD_LEN]; char model[FIELD_LEN]; }; struct CarRegistryEntry { char regNum[REG_LEN]; char regCity[FIELD_LEN]; char owner[FIELD_LEN]; int year; struct Vehicle car; }; void PrintCar(struct CarRegistryEntry motor); void PrintCarUsingPtr(struct CarRegistryEntry *car); int main(void) { struct CarRegistryEntry indestructibleHilux; indestructibleHilux = (struct CarRegistryEntry) {.regNum = "E473CJN", .regCity = "London", .owner = "The Stig", .year = 1988, .car.make = "Toyota", .car.model ="Hilux"}; PrintCar(indestructibleHilux); PrintCarUsingPtr(&indestructibleHilux); return 0; } /** * Description: Outputs the details of an automobile using . notation * * Parameters: motor, vehicle structure with the details of a car * * Return: none */ void PrintCar(struct CarRegistryEntry motor) { printf("%s %s, reg number %s, belongs to %s and is registered in %s\n", motor.car.make, motor.car.model, motor.regNum, motor.owner, motor.regCity); } /** * Description: Outputs the details of an automobile using -> notation * * Parameters: motor, vehicle structure with the details of a car * * Return: none */ void PrintCarUsingPtr(struct CarRegistryEntry *motor) { printf("%s %s, reg number %s, belongs to %s and is registered in %s\n", motor->car.make, motor->car.model, motor->regNum, motor->owner, motor->regCity); } |