Итак, у меня есть следующий код, и он не работает так, как мне бы хотелось. Поскольку я не специалист по работе со структурами, я не могу найти проблему.проблемы с структурами ссылок и разыменований
typedef struct foo {
int a;
int b;
int c;
} bar;
int function(bar *a) {
int m[3] = {0};
//
//code filling m with values
//
if (condition == true) {
a = (bar*)&m;
printf("%d", a->a);
status = SUCCESS;
}
//
//other code
//
return status;
}
int main() {
int ret=0;
bar a;
ret = function (&a);
if (ret == SUCCESS) {
printf(" %d ", a.a);
}
}
Первый printf (один в функции) выводит правильное значение. Второй - нет. Может ли кто-нибудь помочь мне в этом? Спасибо.
Что заставляет вас думать, что 'int [3]' эквивалентно 'struct foo'? Как вы учитываете * padding *, который компилятор может или не может вставить? Дальше 'a = (bar *) & m;' является * per se * нарушением * строгого правила псевдонимов * (см. [** строгое правило сглаживания **] (http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule)) –
Я видел что-то подобное в другом месте, и я подумал, что могу использовать его здесь, чтобы избавить себя от необходимости вручную заполнить панель a. ЧЕТКО Я ошибался. То, что я хотел сделать, это программа, чтобы читать 3 байта двоичных данных и «вставлять» их на панель a. – user2544187
Есть редко хорошие ярлыки. Вы можете сделать что-то похожее на то, что вы описали, если вы создаете 'bar' как * bitfield * struct, а затем заполняете его' memcpy' или читаете байты непосредственно из потока с помощью 'fread'. Существует много примеров использования битбита на этом сайте. –