Здесь я вижу несколько проблем.Во-первых, вы не можете объявлять подобные структуры.Переменная void *
является указателем.Вы пытаетесь определить всю структуру на своем месте и используете для этого неправильный синтаксис.Я удивлен, что компилятор не отклонил код.
Вам, очевидно, нужно будет определить структуру, которая также принимает 3 целочисленных указателя для значений.Если вы действительно хотите объявить все сразу, и четвертый элемент должен быть указателем, вы можете использовать составной литерал следующим образом:
#pragma GCC diagnostic ignored "-Wmissing-braces"
struct other_struct {
const int *x;
const uint16 *y;
const int *z;
};
struct STR s2[2] = {
{1, 4, 6, (struct other_struct[1]){&s2[0].x, &s2[0].y, &s2[0].z}},
{10,40, 60, (struct other_struct[1]){&s2[1].x, &s2[1].y, &s2[1].z}}
};
Обратите внимание, что компилятор может отклонить соединениебуквально в области видимости файла (я думаю, что MSCV делает).
Вы также, похоже, стали жертвой заполнения.Компилятор всегда будет пытаться выровнять данные в структуре по кратному размеру слова вашей машины (8 байт для 64-битной), если вы явно не скажете этого не делать.Кроме того, вещи часто выстраиваются по крайней мере до 4-байтовой границы (размер целого числа).Поскольку то, что вы делаете, является совершенно неопределенным поведением, ваш компилятор просто попытался расширить структуру, задав каждому элементу размер целого числа.Когда вы пытаетесь просмотреть следующий int16 в своей структуре, вы смотрите вперед на 2 байта, но следующее значение фактически на 4 байта вперед, поэтому вы получаете значение 0. Это также объясняет, почему это работает, когда вы приводите к int *
.
РЕДАКТИРОВАТЬ: На самом деле я сделал ошибку выше.Сожалею.Ваш код не работал должным образом не обязательно из-за заполнения, а из-за того, как вы написали арифметику указателей .Попытка найти элементы в исходном массиве таким способом на самом деле невозможна, и, конечно, в любом случае неопределенное поведение.