Question: I am reading a book called C for Java Programmers. 
It gives an example about nameless structs that I do not undestand.
It says that this is valid:

```
struct{
 int val1, val2;
 double val3;
} s1,s2;

  s1.val1 = 5;
  s2.val3 = 4.6;

```

If structs are similar to objects in Java, why can't I just say val1 = 5 and val2 = 4.6?
What is the point of s1 and s2?

Thanks

Answer: 
Coming from java you can think of a C struct like a class without member functions:

```
//java:
class SomeData1 {
    public int val1;
    public int val2;
    public double val3;
}

```

So then you'd do:

```
// java:
SomeData1 s1= new SomeData1();
s1.val1 = 5;

```

In C you can use a struct like this by naming the structure:

```
// C:
typedef struct {
  int val1, val2;
  double val3;
} SomeData1;

```

Then you can set values:

```
// C:
SomeData1 s1;
s1.val1 = 5;

```

But it's also possible to use a structure "nameless" as you've seen in the example you posted:

```
struct{
 int val1, val2;
 double val3;
} s1,s2;

```

In this case you can still access the `s1` and `s2` structure's values:

```
s1.val1 = 5;

```

But you can't refer to the original structure... can't make additional instances (however many you declare initially, are the only ones you are going to get) of it. IMO the nameless structure isn't very useful.
That is a nice and elegant way of doing so:

```
struct s {
  int val1, val2;
  double val3;
};

struct s s1 = {
  .val1 = 1,
  .val3 = 3.1444
};

```

`s1.val2` will be set to `0` by the compiler. It is commonly used in [linux kernel source code](http://lxr.free-electrons.com/source/arch/arm/mach-mmp/aspenite.c#L185).