Форум программистов, компьютерный форум CyberForum.ru

Указатель на не объявленную структуру - C++

Восстановить пароль Регистрация
 
VD
 Аватар для VD
18 / 7 / 2
Регистрация: 02.08.2012
Сообщений: 71
05.08.2014, 20:27     Указатель на не объявленную структуру #1
Допустим я описал структуру. Объявил указатель на эту структуру.
C++
1
2
3
4
5
6
    struct MyStruct{
        char ch;
        int i;
    };
    std::cout<<sizeof(MyStruct);
    MyStruct * pMyStruct;
Из за выравнивания размер структуры 8 байт, хотя данных там на пять байт.
Так вот допустим эти пять байт последовательно лежат в памяти.
Я присваиваю указателю на свою структуру адрес первого байта.
Будут ли корректно отображаться поля структуры если к ним обращаться через данный указатель.
P.S.
Видел подобное в коде но не смог найти где почитать про это.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2014, 20:27     Указатель на не объявленную структуру
Посмотрите здесь:

Указатель void на структуру C++
Указатель на структуру C++
C++ указатель на структуру
C++ указатель на структуру
указатель на структуру C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
05.08.2014, 20:31     Указатель на не объявленную структуру #2
Цитата Сообщение от VD Посмотреть сообщение
Будут ли корректно отображаться поля структуры если к ним обращаться через данный указатель.
это зависит от того, что лежит в памяти

Добавлено через 1 минуту
Цитата Сообщение от VD Посмотреть сообщение
Из за выравнивания размер структуры 8 байт, хотя данных там на пять байт.
поменяй местами и не будет "дыры"
можно отключить выравнивание
VD
 Аватар для VD
18 / 7 / 2
Регистрация: 02.08.2012
Сообщений: 71
05.08.2014, 20:44  [ТС]     Указатель на не объявленную структуру #3
Отключения выравнивания мне не подойдет, так же как и поменять местами.
Я знаю точно что в памяти лежат 5 байт - значения для этой структуры(т.е. 1 байт это ch, остальные четыре это i)
С PE форматом вожусь(структуры все определены майкрософтом)
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
05.08.2014, 20:55     Указатель на не объявленную структуру #4
Цитата Сообщение от VD Посмотреть сообщение
С PE форматом вожусь(структуры все определены майкрософтом)
так для них уже есть и структуры и функции
Цитата Сообщение от VD Посмотреть сообщение
Я знаю точно что в памяти лежат 5 байт - значения для этой структуры
как лежит вот вопрос
может лежать один байт char следующие 4 int
может лежать один байт char один выравнивание следующие 4 int
может так
может лежать один байт char три выравнивание следующие 4 int
VD
 Аватар для VD
18 / 7 / 2
Регистрация: 02.08.2012
Сообщений: 71
05.08.2014, 21:01  [ТС]     Указатель на не объявленную структуру #5
я вроде объяснил как лежат но да ладно может не так что сказал
короче вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(){
    HANDLE hFile, hMapping;
    DWORD d;
    char *map;
    PIMAGE_DOS_HEADER pIDH;
    PIMAGE_NT_HEADERS pINTH;
    int i;
 
    hFile = CreateFileA(fname, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    if(hFile!=INVALID_HANDLE_VALUE){
        d = GetFileSize(hFile, 0);
        hMapping = CreateFileMappingA(hFile, 0, PAGE_READWRITE, 0, d, 0);
        map = (char*)MapViewOfFile(hMapping, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, d);
 
        pIDH =(PIMAGE_DOS_HEADER)map;
        ;
        UnmapViewOfFile(map);
        CloseHandle(hMapping);
        CloseHandle(hFile);
    }
    else
        MessageBoxA(0, "Not found", 0, 0);
}
Так вот будет ли указатель корректно отображать поля структуры? Я это взял из чьего то кода
Где вообще можно почитать про это?
zss
Модератор
Эксперт С++
 Аватар для zss
5944 / 5549 / 1783
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
05.08.2014, 21:05     Указатель на не объявленную структуру #6
А по моему, не может int располагаться с произвольного адреса,
а должен всегда быть выравненным в соответствии с размером.
Проверил - в Windows получается
Цитата Сообщение от ValeryS Посмотреть сообщение
может лежать один байт char три выравнивание следующие 4 int
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
05.08.2014, 21:19     Указатель на не объявленную структуру #7
Цитата Сообщение от zss Посмотреть сообщение
А по моему, не может int располагаться с произвольного адреса,
а должен всегда быть выравненным в соответствии с размером.
так выравнивание то может быть равно 1
но у структуры IMAGE_DOS_HEADER все подогнано чтобы не было дыр
вот кстати она
http://www.firststeps.ru/mfc/winapi/r.php?23
а вот и IMAGE_NT_HEADERS
http://www.firststeps.ru/mfc/winapi/r.php?24
немного практики
http://kaimi.ru/2011/08/pe-sections-info/
VD
 Аватар для VD
18 / 7 / 2
Регистрация: 02.08.2012
Сообщений: 71
05.08.2014, 21:25  [ТС]     Указатель на не объявленную структуру #8
Вот я тоже подумал что у неё все подогнано, хочу еще посмотреть подогнано ли у других структур. Так значит если было бы не подогнано указатель бы не верные значения полей выдавал?
-=ЮрА=-
Заблокирован
Автор FAQ
05.08.2014, 21:27     Указатель на не объявленную структуру #9
Цитата Сообщение от VD Посмотреть сообщение
з за выравнивания размер структуры 8 байт, хотя данных там на пять байт.
Так вот допустим эти пять байт последовательно лежат в памяти.
Я присваиваю указателю на свою структуру адрес первого байта.
Будут ли корректно отображаться поля структуры если к ним обращаться через данный указатель.
P.S.
Видел подобное в коде но не смог найти где почитать про это.
- косяки с выравниванием могу привеси к косякам с упаковкой классов в которых они использованы и как следствием возможным смещением адреса this (будете "приятно" удивлены когда вместо своего класса будете попадать в какую то кучу и даже не понимать почему так)
Выравнивайте то что должно быть выровняно и не полагайтесь на авось.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
05.08.2014, 21:40     Указатель на не объявленную структуру #10
VD,
общие принципы выравнивания(для 32 битных систем)
char(BYTE) по любому адресу
short(WORD) адрес кратен двум
int (DWORD) адрес кратен четырем
long (DWORD) адрес кратен четырем
long long (QWORD)адрес кратен восьми
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2014, 21:44     Указатель на не объявленную структуру
Еще ссылки по теме:

Создать указатель на структуру C++
Указатель на структуру, синтаксис C++
Указатель на структуру C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
VD
 Аватар для VD
18 / 7 / 2
Регистрация: 02.08.2012
Сообщений: 71
05.08.2014, 21:44  [ТС]     Указатель на не объявленную структуру #11
Ладно, всем спасибо
Yandex
Объявления
05.08.2014, 21:44     Указатель на не объявленную структуру
Ответ Создать тему
Опции темы

Текущее время: 17:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru