Question: Say I have a struct defined somewhere deep in low-level code used all over the place in the most crazy and unknown ways:

```
struct T {
    unsigned short name_len;
    char d_name[LENGTH];
}

```

With accompanying functions that fill d\_name with whatever needs to be put there, like

```
struct T* fill( somethingOrOther* X)

```

And I would like to extend the old struct+function to include a new variable:

```
struct T {
    unsigned short name_len;
    char d_name[LENGTH];
    unsigned short type_len;
    char d_type;
}

```

and the new version of the function would also fill the d\_type variable with useful things.

Would this type of change break the API? Couldn't I just use the new T instead of the old T, and additionally access the new members?

Answer: 
It might make sense to extend your structs like this:

```
struct newT {
    struct T t;
    int newElement;
    ...
}

```

Then you can safely use a newT pointer as a T pointer; the C standard guarantees that there is no padding before the first element of a struct.
If T really is used all over the place in crazy and unknown ways, then a change like that is likely to break something. Somewhere there will be a piece of code that has a local declaration of T instead of using your header file, or casts a 'mystruct \*' to a 'T \*', or something equally repugnant.