7

I'm learning how to work with structs in C and wrote the following example:

#include <stdio.h>
#include <stdlib.h>

struct s1{
    unsigned short member;
};

int main()
{
    struct s1 *s1_ptr = malloc(sizeof(*s1_ptr));
    s1_ptr -> member = 10;
    printf("Member = %d\n", *s1_ptr); // Member = 10
}

QUESTION: Is it guaranteed that in all cases a pointer to a struct is a exactly the same pointer to its first element?

In this particular case it works as I expected, but I'm not sure if it is guaranteed. Is compiler free to insert some padding in the very beginning?

The only I could find about the structure type layout is the Section 6.2.5 Types of N1570:

A structure type describes a sequentially allocated nonempty set of member objects (and, in certain circumstances, an incomplete array), each of which has an optionally specified name and possibly distinct type.

But there is nothing about padding here.

St.Antario
  • 26,175
  • 41
  • 130
  • 318
  • 3
    Yes and No. The types of the pointers are different, so No (they aren't exactly the same). The addresses the pointers point at are the same, so Yes. See C11 [§6.7.2.1 Structure and union specifiers ¶15](http://port70.net/~nsz/c/c11/n1570.html#6.7.2.1p15): _A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. There may be unnamed padding within a structure object, but not at its beginning._ – Jonathan Leffler Dec 02 '18 at 08:30
  • As noting your profile icon: Be aware that this is not (necessarily) alike in C++... – Aconcagua Dec 02 '18 at 09:02

2 Answers2

12

The padding at the start is covered by 6.7.2.1p15 (emphasis mine)

Within a structure object, the non-bit-field members and the units in which bit-fields reside have addresses that increase in the order in which they are declared. A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. There may be unnamed padding within a structure object, but not at its beginning.

So the address of a struct is the address of of its first member. And following a pointer conversion, you are able to obtain one from the other.

StoryTeller - Unslander Monica
  • 165,132
  • 21
  • 377
  • 458