Как в памяти выглядит 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д