Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
ПростоЯ
184 / 101 / 8
Регистрация: 30.05.2009
Сообщений: 759
1

Поясните результат работы программы

25.03.2013, 16:44. Просмотров 369. Ответов 4
Метки нет (Все метки)

Поясните, пожалуйста, результат следующей программы:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
struct A {
char a;
int b;
char c;
};
int main() {
std::cout << sizeof(A);
}
В итоге на экран выводится цифра 12. Почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2013, 16:44
Ответы с готовыми решениями:

Определить результат работы программы
16)Баллов: 1 Результат работы фрагмента программы char a, b, c; a='b';...

Какой результат работы этой программы?
int main(){ //(1) int var = 5; if(fork())wait(&amp;var); var++;...

Объясните пожалуйста результат работы программы
#include &lt;iostream&gt; using namespace std; int main() { short int i; ...

Объясните результат работы следующей программы
double x =1.23456789; for(int i=0; i&lt;1030;i++) x=x/2; for( int i=0; i...

Не могу разобраться в коде. Некорректный результат работы программы
Ввести с клавиатуры числа x, E . Последовательность a,a....a образована по...

4
fjay69
87 / 87 / 17
Регистрация: 26.10.2012
Сообщений: 248
25.03.2013, 16:51 2
Это особенности размещения данных в памяти. По умолчанию, данные раскидываются в кластеры по 4 байта. То есть вышеприведённая структура будет выглядеть в памяти так:
C000IIIIC000, где C - char (1 байт), IIII - int (4 байта), 0 - пустой байт
Но если написать вот так:
C++
1
2
3
4
5
6
7
#pragma pack (push, 1)
struct A {
char a;
int b;
char c;
};
#pragma pack (pop)
данные разместятся так: CIIIIC
И тогда sizeof выдаст 6, как и положено.
1
ПростоЯ
184 / 101 / 8
Регистрация: 30.05.2009
Сообщений: 759
25.03.2013, 16:59  [ТС] 3
Цитата Сообщение от fjay69 Посмотреть сообщение
И тогда sizeof выдаст 6, как и положено.
но выводится же 12, а не 6
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 17:07 4
http://www.kalinin.ru/programming/cpp/31_07_00.shtml
http://habrahabr.ru/post/142662/
Использование #pragma pack(push,1)... pack(pop)
0
Kastaneda
Jesus loves me
Эксперт С++
4940 / 3016 / 346
Регистрация: 12.12.2009
Сообщений: 7,612
Записей в блоге: 2
Завершенные тесты: 1
25.03.2013, 17:19 5
Цитата Сообщение от ПростоЯ Посмотреть сообщение
но выводится же 12, а не 6
Директива #pragma есть implementation-defined, и если препроцессор компилятора не поддерживает ее, то то, что следует после pragma, он молча проглотит ничего не сделав.
Поэтому при использовании #pragma следует указывать компилятор (чего в статье на хабре кстати не сделано)).

в gcc можно сделать так
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
struct A {
char a;
int b;
char c;
}__attribute__((aligned(1),packed));
 
int main() {
std::cout << sizeof(A);
}
вывод 6.

Добавлено через 4 минуты
ну и для полноты поста, цитата из стандарта
16.6 Pragma directive

A preprocessing directive of the form
# pragma pp-tokensopt new-line
causes the implementation to behave in an implementation-defined manner. Any pragma that is not recog-
nized by the implementation is ignored.
2
25.03.2013, 17:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 17:19

Результат работы программы, запущенной в командной строке и в VS, отличается
Здравствуйте. Не могу понять, каким образом результат выдало разный. Ведь...

Как скопировать результат работы программы в буфер обмена?
Здравствуйте! Я начинающий программист и ещё совсем плохо разбираюсь. Нужно,...

Из файла прочесть массив, а результат работы программы записать в файл
На практике дали задание, в котором надо из файла прочесть массив, а результат...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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