Russian Qt Forum
Июнь 06, 2024, 01:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: GetFParams()[1] непонятно)  (Прочитано 4416 раз)
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];
правая ее часть)объясните,пожалуйста, что за обращение?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Март 23, 2012, 13:25 »

Как известно в С массив - суть указатель, следовательно правая часть обращается к второму значению массива FParams  в структуре.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 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 элементов) и могу его использовать

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

« Последнее редактирование: Март 23, 2012, 13:31 от Igors » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Март 23, 2012, 13:30 »

следовательно правая часть обращается к второму значению массива FParams  в структуре.
Ко второму значению, которого нет.  Улыбающийся То есть просто читает 2 байта, которые лежат в памяти после этой структуры.
Записан
mutineer
Гость
« Ответ #4 : Март 23, 2012, 13:31 »

o.GetFParams()[1] вернет мусор (некорректное значение) за пределами TMStructObj - а может и вылететь.

А в каком случае может вылететь от попытки чтения адреса, следующего за валидным?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 23, 2012, 13:33 »

А в каком случае может вылететь от попытки чтения адреса, следующего за валидным?
Если адрес пересек границу страницы
Записан
IzoLda
Гость
« Ответ #6 : Март 23, 2012, 13:48 »

видимо про адресное пространство мне следует почитать...на счет наращивания хвоста, не совсем понятно в какой момент и где это наращивается?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Март 23, 2012, 14:04 »

видимо про адресное пространство мне следует почитать...на счет наращивания хвоста, не совсем понятно в какой момент и где это наращивается?
В момент распределения TMStructObj, т.е. Вы можете создать указатели на нее напр один с 10 элементами, др с 20 и.т.п. После того как структура распределена размер хвоста уже не изменить (для созданного экземпляра). Часто (как правило) реальное число элементов записывается в саму структуру
Записан
IzoLda
Гость
« Ответ #8 : Март 23, 2012, 14:37 »

спасибо Улыбающийся разобралась!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 20.