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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VD
22 / 11 / 2
Регистрация: 02.08.2012
Сообщений: 143
#1

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

05.08.2014, 20:27. Просмотров 277. Ответов 10
Метки нет (Все метки)

Допустим я описал структуру. Объявил указатель на эту структуру.
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     Указатель на не объявленную структуру
Посмотрите здесь:

Указатель на структуру - C++
Здравствуйте, есть кусок кода(объявления)(смотри ниже) Проблема в том, что компилятор, как я понял, почему-то не понимает указатель на...

Указатель на структуру - C++
почему не работает? p-&gt;g=3; printf(&quot;%d&quot;,p-&gt;g);

Указатель на структуру - C++
Добрый день, struct list_head { struct list_head *next, *prev; }; 1) зачем такое вообще? 2) типом указателя могло...

Указатель на структуру - C++
Как с помощью переменной указателя на тип свой структуры вывести на экран значение полей в экземпляре? Написал вот что: #include...

Указатель на структуру - C++
Помогите пожалуйста, надо самому разобраться в си++, вот и застрял в указателях на структуру,при компиляции ошибку выдаёт на начале функции...

указатель на структуру - C++
по заданию: Описать структуру заповедник, которая содержит информацию о животных, содержащихся в заповеднике: название, вид, класс,...

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

Добавлено через 1 минуту
Цитата Сообщение от VD Посмотреть сообщение
Из за выравнивания размер структуры 8 байт, хотя данных там на пять байт.
поменяй местами и не будет "дыры"
можно отключить выравнивание
VD
22 / 11 / 2
Регистрация: 02.08.2012
Сообщений: 143
05.08.2014, 20:44  [ТС]     Указатель на не объявленную структуру #3
Отключения выравнивания мне не подойдет, так же как и поменять местами.
Я знаю точно что в памяти лежат 5 байт - значения для этой структуры(т.е. 1 байт это ch, остальные четыре это i)
С PE форматом вожусь(структуры все определены майкрософтом)
ValeryS
Модератор
6543 / 5009 / 462
Регистрация: 14.02.2011
Сообщений: 16,656
05.08.2014, 20:55     Указатель на не объявленную структуру #4
Цитата Сообщение от VD Посмотреть сообщение
С PE форматом вожусь(структуры все определены майкрософтом)
так для них уже есть и структуры и функции
Цитата Сообщение от VD Посмотреть сообщение
Я знаю точно что в памяти лежат 5 байт - значения для этой структуры
как лежит вот вопрос
может лежать один байт char следующие 4 int
может лежать один байт char один выравнивание следующие 4 int
может так
может лежать один байт char три выравнивание следующие 4 int
VD
22 / 11 / 2
Регистрация: 02.08.2012
Сообщений: 143
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
Модератор
Эксперт С++
6287 / 5890 / 1910
Регистрация: 18.12.2011
Сообщений: 15,123
Завершенные тесты: 1
05.08.2014, 21:05     Указатель на не объявленную структуру #6
А по моему, не может int располагаться с произвольного адреса,
а должен всегда быть выравненным в соответствии с размером.
Проверил - в Windows получается
Цитата Сообщение от ValeryS Посмотреть сообщение
может лежать один байт char три выравнивание следующие 4 int
ValeryS
Модератор
6543 / 5009 / 462
Регистрация: 14.02.2011
Сообщений: 16,656
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
22 / 11 / 2
Регистрация: 02.08.2012
Сообщений: 143
05.08.2014, 21:25  [ТС]     Указатель на не объявленную структуру #8
Вот я тоже подумал что у неё все подогнано, хочу еще посмотреть подогнано ли у других структур. Так значит если было бы не подогнано указатель бы не верные значения полей выдавал?
-=ЮрА=-
Заблокирован
Автор FAQ
05.08.2014, 21:27     Указатель на не объявленную структуру #9
Цитата Сообщение от VD Посмотреть сообщение
з за выравнивания размер структуры 8 байт, хотя данных там на пять байт.
Так вот допустим эти пять байт последовательно лежат в памяти.
Я присваиваю указателю на свою структуру адрес первого байта.
Будут ли корректно отображаться поля структуры если к ним обращаться через данный указатель.
P.S.
Видел подобное в коде но не смог найти где почитать про это.
- косяки с выравниванием могу привеси к косякам с упаковкой классов в которых они использованы и как следствием возможным смещением адреса this (будете "приятно" удивлены когда вместо своего класса будете попадать в какую то кучу и даже не понимать почему так)
Выравнивайте то что должно быть выровняно и не полагайтесь на авось.
ValeryS
Модератор
6543 / 5009 / 462
Регистрация: 14.02.2011
Сообщений: 16,656
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++
если struct1,это структура,а acccum,это функция то что значит struct1 &amp; accum(struct1 &amp;target, struct1 &amp;source) Добавлено через 1...

Указатель на структуру - C++
Здравствуйте. Задача: Написать функцию, осуществляющую поиск студента в структуре, а так же определяющую курс на котором студент...

Указатель на структуру - C++
Здравствуйте. Объявлена структура: typedef struct str { long field1; .... } str_1;

Создать указатель на структуру - C++
Информация об участниках спортивных соревнований содержит название страны, название команды, ФИО игрока, игровой номер, возраст, рост и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru