Указатель на структуру указатель на его первый член? - PullRequest
0 голосов
/ 02 декабря 2018

Я учусь работать с struct s в C и написал следующий пример:

#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
}

ВОПРОС: Гарантируется ли, чтово всех случаях указатель на структуру является точно таким же указателем на его первый элемент?

В этом конкретном случае он работает, как я ожидал, но я не уверен, гарантируется ли это.Есть ли у компилятора возможность вставлять некоторые отступы в самом начале?

Единственное, что я смог найти в макете типа структуры, это Section 6.2.5 Types из N1570 :

Тип структуры описывает последовательно распределенный непустой набор объектов-членов (и, при определенных обстоятельствах, неполный массив), каждый из которых имеет необязательно указанное имя и, возможно, отдельный тип.

Но естьничего о заполнении здесь.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Заполнение в начале покрывается 6.7.2.1p15 (выделение минно)

Внутри объекта структуры, элементов, не являющихся битовыми полями, и единиц ву каких битовых полей есть адреса, которые увеличиваются в порядке их объявления.Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный элемент (или, если этот элемент является битовым полем, затем на модуль, в котором он находится), и наоборот. В объекте структуры может быть безымянный отступ, но не в его начале .

Таким образом, адрес структуры - это адрес ее первого члена.И после преобразования указателя вы можете получить один из другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...