There are a number of errors in your code! To address the 'other' ones first:
- You need to provide function prototypes for
AddCar
and ShowCar
before you use them, or the compiler will assume they return int
and then complain when it sees the actual definitions.
- Your
main
function (properly) returns 0
but it is declared as void
- so change it to int main(...)
.
And the 'real' problem: you are passing your car
structure to AddCar
by value - which means a copy is made, then passed to the function. Changes to that copy will not affect the variable in the calling module (i.e. in main
). To fix this, you need to pass a pointer to the car
struct, and use the ->
operator (in place of the .
operator) in that function.
Here's a 'fixed' version of your code, with comments added where I've made significant changes:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct car {
char plate[10];
char model[20];
char color[10];
};
// Add your functions' prototypes before you use them...
void AddCar(struct car *c, char p[10], char m[10], char r[10]);
void ShowCar(struct car c);
int main() // If you return an int, you must declare that you do!
{
struct car c[4];
// Here, we pass a pointer to `c[0]` by adding the `&` (address of)...
AddCar(&c[0], "43ds43", "ford", "blue");
ShowCar(c[0]);
return 0;
}
void AddCar(struct car *c, char p[10], char m[10], char r[10])
{ // ^ To modify a variable, the function needs a POINTER to it!
strcpy(c->plate, p);
strcpy(c->model, m); // For pointers to structures, we can use "->" in place of "."
strcpy(c->color, r);
}
void ShowCar(struct car c)
{
printf("Plate: %s Model: %s Color: %s\n-------", c.plate, c.model, c.color);
}
Feel free to ask for further clarification and/or explanation.