передача адреса упакованного члена структуры - PullRequest
0 голосов
/ 29 июня 2018

Я занимаюсь разработкой приложения на C / C ++, в котором я использую упакованные члены структуры. Я читал, что мы никогда не должны передавать адрес упакованных членов структуры какой-либо функции (я всегда использовал, чтобы получить ошибки выравнивания при передаче упакованных членов структуры посредством ссылки на функции в качестве аргументов). Поэтому я хочу знать, применимо ли это даже в случае встроенных функций sscanf и т. Д. Это мой фрагмент кода

#pragma pack(push,1)
struct A
{
    char a;
    short b;
    int c;
};
#pragma pack(pop)

int main(int argc, char* argv[])
{
    struct A abc;
    char ch[100];
    ...
    //read some data from file into character array ch
    sscanf(ch,"%hu %d",&abc.b,&abc.c);
    ...

    return 0;
}

Я использую свое приложение для архитектуры Power PC.

1 Ответ

0 голосов
/ 29 июня 2018

sscanf обращается к полям данных, как и любая другая функция, поэтому, если доступ к неправильно выровненным данным вызывает исключение, sscanf также потерпит неудачу. Однако некоторые архитектуры допускают невыровненные данные, они просто получают доступ к таким данным медленнее, чем выровненные.

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

...