Передача адреса упакованного члена структуры
Я разрабатываю приложение на 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 ответ
sscanf обращается к полям данных, как и любая другая функция, поэтому, если доступ к неправильно выровненным данным вызывает исключение, sscanf также потерпит неудачу. Однако некоторые архитектуры допускают невыровненные данные, они просто получают доступ к таким данным медленнее, чем выровненные.
В общем, предполагать что-либо о выравнивании данных - плохая практика, которая приводит к очень неясным ошибкам. Только не делайте этого, всегда есть лучший (и более безопасный) способ.