Russian Qt Forum

Программирование => С/C++ => Тема начата: IzoLda от Март 23, 2012, 13:09



Название: GetFParams()[1] непонятно)
Отправлено: IzoLda от Март 23, 2012, 13:09
имеется функция, возвращающая указатель на целое...также структура на элемент экземпляра которого он обращается.
Код:
const u_int16* GetFParams(){ return Obj->Struct->FParams;};
struct TMStructObj
{
byte FParamsQn;
byte CompsQn;
u_int16 FParams[1];

};
Вопрос простой,но мне непонятна следующая строка
u_int16 KoNums[0] = o.GetFParams()[1];
правая ее часть)объясните,пожалуйста, что за обращение?


Название: Re: GetFParams()[1] непонятно)
Отправлено: Kurles от Март 23, 2012, 13:25
Как известно в С массив - суть указатель, следовательно правая часть обращается к второму значению массива FParams  в структуре.


Название: Re: GetFParams()[1] непонятно)
Отправлено: Igors от Март 23, 2012, 13:29
Указатель и массив в С - одно и то же (почти).
Код
C++ (Qt)
const u_int16 * ptr = o.GetFParams();
u_int16 val = ptr[0];
 
Однако обратите внимание: в структуре массив имеет 1 элемент, поэтому
o.GetFParams()[0] правильно а o.GetFParams()[1] вернет мусор (некорректное значение) за пределами TMStructObj - а может и вылететь. Но так может быть сделано умышленно - "хвост" используется как массив переменной длины. Напр
Код
C++ (Qt)
TMStructObj * obj = (TMStructObj *) malloc(sizeof(TMStructObj) + sizeof(u_int16) * 5);
 
Так я "отрастил хвост" (5 элементов) и могу его использовать

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



Название: Re: GetFParams()[1] непонятно)
Отправлено: LisandreL от Март 23, 2012, 13:30
следовательно правая часть обращается к второму значению массива FParams  в структуре.
Ко второму значению, которого нет.  :) То есть просто читает 2 байта, которые лежат в памяти после этой структуры.


Название: Re: GetFParams()[1] непонятно)
Отправлено: mutineer от Март 23, 2012, 13:31
o.GetFParams()[1] вернет мусор (некорректное значение) за пределами TMStructObj - а может и вылететь.

А в каком случае может вылететь от попытки чтения адреса, следующего за валидным?


Название: Re: GetFParams()[1] непонятно)
Отправлено: Igors от Март 23, 2012, 13:33
А в каком случае может вылететь от попытки чтения адреса, следующего за валидным?
Если адрес пересек границу страницы


Название: Re: GetFParams()[1] непонятно)
Отправлено: IzoLda от Март 23, 2012, 13:48
видимо про адресное пространство мне следует почитать...на счет наращивания хвоста, не совсем понятно в какой момент и где это наращивается?


Название: Re: GetFParams()[1] непонятно)
Отправлено: Igors от Март 23, 2012, 14:04
видимо про адресное пространство мне следует почитать...на счет наращивания хвоста, не совсем понятно в какой момент и где это наращивается?
В момент распределения TMStructObj, т.е. Вы можете создать указатели на нее напр один с 10 элементами, др с 20 и.т.п. После того как структура распределена размер хвоста уже не изменить (для созданного экземпляра). Часто (как правило) реальное число элементов записывается в саму структуру


Название: Re: GetFParams()[1] непонятно)
Отправлено: IzoLda от Март 23, 2012, 14:37
спасибо :) разобралась!