Язык
C гарантирует, что указатель на любой struct
может быть преобразован в void *
и наоборот.Кроме того, язык позволяет определять указатели на struct
также, если он не определен.Я бы предположил, что, поскольку компилятор ничего не знает об этих структурах, их указатели должны иметь одинаковое физическое представление.Рассмотрим эти строки в два отдельных модуля:
/* FILE1.c */
void *mem = ...; //Points to a suitable memory block
struct s1 *p1; //No implementation given for struct s1
void *mem2;
p1 = (struct s1 *)mem;
mem2 = &p1;
/* FILE2.c */
extern void *mem2;
struct s2 { /*...fields...*/ };
struct s2 *p2;
p2 = *(struct s2 **)mem2;
Способен ли этот код работать на всех платформах, при условии, что блок памяти достаточно большой, чтобы содержать struct s2
(например, выделенный malloc(sizeof(struct s2))
)?
Другими словами, является ли правильным (т. Е. Переносимым) переосмысление ячейки памяти, содержащей указатель на структуру struct s1
, как если бы это был указатель на struct s2
?
(Отказ от ответственности): Я прекрасно понимаю, что это очень странный способ играть с указателями, мой вопрос теоретический)