Как в памяти выглядит struct и как к нему обращается оператор "."? - C (СИ)
Формулировка задачи:
Например,
char* s = malloc(sizeof(char));
Здесь malloc() ищет в куче свободную память, выделяет ее размером в сhar и возвращает указатель на начало массива.
А что происходит в памяти, когда мы пишем struct и обращаемся через . к переменной а?
struct bar
{
int a;
char*s;
}foo;
foo.a = 10;Решение задачи: «Как в памяти выглядит struct и как к нему обращается оператор "."?»
textual
Листинг программы
#include <stdio.h>
#include <stddef.h>
#pragma pack(1)
typedef struct{
char x;
int y;
char z;
} TEST;
#define GETFIELDPTR(OBJECT, FIELD) \
(typeof(OBJECT.FIELD)*)(((char*)&(OBJECT))+offsetof(typeof(OBJECT), FIELD))
int main(void)
{
TEST t = {14, 17, 88};
typeof(t) xxx;
printf("%d, %d, %d\n", t.x, t.y, t.z);
printf("%d, %d, %d\n", *GETFIELDPTR(t, x), *GETFIELDPTR(t, y), *GETFIELDPTR(t, z));
}
Объяснение кода листинга программы
В данном коде определен тип структуры TEST, который содержит три поля: x типа char, y типа int и z типа char. Далее, определен макрос GETFIELDPTR, который позволяет получить указатель на поле структуры.
В функции main создается экземпляр структуры TEST с именем t, инициализированный значениями 14, 17, 88 соответственно для полей x, y, z.
Затем, создается неопределенное поле xxx типа typeof(t), и в него записывается адрес первого байта структуры t.
Далее, выводятся значения полей структуры t на экран с помощью функции printf.
Затем, используя макрос GETFIELDPTR, получаем указатели на поля структуры t и выводим их значения на экран с помощью функции printf.