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

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

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

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

05.08.2014, 20:27. Просмотров 283. Ответов 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++
#include &quot;stdafx.h&quot; #include &quot;ctime&quot; #include &quot;iostream&quot; #pragma warning(disable : 4996) using namespace std; class...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,224
Завершенные тесты: 1
05.08.2014, 21:05 #6
А по моему, не может int располагаться с произвольного адреса,
а должен всегда быть выравненным в соответствии с размером.
Проверил - в Windows получается
Цитата Сообщение от ValeryS Посмотреть сообщение
может лежать один байт char три выравнивание следующие 4 int
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
05.08.2014, 21:40 #10
VD,
общие принципы выравнивания(для 32 битных систем)
char(BYTE) по любому адресу
short(WORD) адрес кратен двум
int (DWORD) адрес кратен четырем
long (DWORD) адрес кратен четырем
long long (QWORD)адрес кратен восьми
VD
22 / 11 / 2
Регистрация: 02.08.2012
Сообщений: 143
05.08.2014, 21:44  [ТС] #11
Ладно, всем спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2014, 21:44
Привет! Вот еще темы с ответами:

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

Указатель на структуру - C++
если struct1,это структура,а acccum,это функция то что значит struct1 &amp; accum(struct1 &amp;target, struct1 &amp;source) Добавлено через 1...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.08.2014, 21:44
Ответ Создать тему
Опции темы

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