LINUX.ORG.RU

отличие адреса структуры в статически инициализированном массиве

 , ,


0

3

Доброго времени суток.

Есть глобальная структура c вложенными структурами конфигурации. Для удобства обращения сложил указатели в статический массив:

static void *cfg_table[DEV_CNT] =
{
    &sys_cntl.ethernet.cfg_cntl,
    &sys_cntl.device[0].cfg_cntl,
    &sys_cntl.device[1].cfg_cntl,
    &sys_cntl.mdev.cfg_cntl
};

Столкнулся с тем, что адрес фактический адрес sys_cntl.ethernet.cfg_cntl, который показывает gdb, отличается от записанного в массиве (сдвинут на несколько байт). Поскольку внутри cfg_cntl есть адреса функций, это заканчивается SIGILL. Архитектура sparc64. Кто-нибудь с этим сталкивался?



Последнее исправление: xaizek (всего исправлений: 1)

Не сталкивался. Поиграйся на https://godbolt.org/ с разными настройками, может придет идея.

blex ★★★
()

Столкнулся с тем, что адрес фактический адрес sys_cntl.ethernet.cfg_cntl, который показывает gdb, отличается от записанного в массиве (сдвинут на несколько байт).

Как именно проверяется адрес? Что будет если проверить через cfg_table[0] == &sys_cntl.ethernet.cfg_cntl?

mxfm ★★
()

Был бы C++, я бы предложил проверить адрес класса vs адрес подкласса. Но может и в C можно во что-нибудь подобное вляпаться.

pr849
()

Кто-нибудь с этим сталкивался?

Все, кто программировал на c. Описано в учебниках.

LamerOk ★★★★★
()
Ответ на: комментарий от pr849

0% пользы.

Вообще-то, я указал, где можно найти ответ.

100% понтов

И с каких пор окончание шкалки считается «понтом»? Или ты её ещё не?

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Итого имеем два коммента по 100% понтов, 0% пользы = суммарно 200% понтов, 0% пользы.

Или ты её ещё не?

Плюс один переход на личности с убогой попыткой оскорбить.

pr849
()

А воспроизводится ли если

  1. Объявить структуру для sys_cntl (глобальную) и структуры для ethernet, массива device и mdev (вложенные) как упакованные?

  2. Объявить массив без блока инициализации и заполнить указателями позже?

UPD:

  1. Объявить структуры с принудительным выравниванием по 8 байтам, т.е.
union {
	struct sys_cntl_type {
		/* ... */
	} sys_cntl;
	uint64_t align;
}
dsl
()
Последнее исправление: dsl (всего исправлений: 2)
Ответ на: комментарий от pr849

Откуда я знаю, почему?

Ну вот, значит не «убогий». Хороший, годный переход на личности. Ещё ни разу меня не подводил. И с тобой не подвёл. :3

LamerOk ★★★★★
()
Ответ на: комментарий от pr849

Не обращайте внимание, это известный троль в темах про си - он никогда ничего толкового не пишет.

mxfm ★★
()

Ну как, получилось что-нибудь? Интрига ведь :)

dsl
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.