2013-12-10 4 views
0

Я написал простую структуру. Вот код программы, которую я написал для печати размера переменных, объявленных внутри корпусногоПолучение неправильного размера структуры после компиляции для персонажа Тип данных

#include<stdio.h> 

main() 
{ 
struct book 
    {char name[10]; 
    int pages; 
    float price; 
    }b1={"Blue",500,200.00}; 
printf("The Address Of Name Is = %d ",&b1.name); 
printf("\nThe Address Of Pages Is = %d",&b1.pages); 
printf("\nThe Address Of Price Is = %d",&b1.price); 

} 

Теперь проблема возникает, когда я компилирую программу и запустить ее. Я получаю размер массива CHARACTER, напечатанный как 12 байтов вместо 10 байтов. Вот вывод -

[email protected]:~$ ./a.out 
The Address Of Name Is = 1264893904 
The Address Of Pages Is = 1264893916 
The Address Of Price Is = 1264893920 

Может кто-нибудь объяснить, почему это происходит? Также обратите внимание, что я работаю в среде Linux.

ответ

1

Это связано с Data Structure Alignment, что означает, что компилятор будет вставлять прокладки между переменными в классе/struct, чтобы убедиться, что следующая переменная попадает на оптимальную границу для доступа к памяти. Это различно для каждого типа.

Существует полное объяснение здесь, в этом ответе: Why isn't sizeof for a struct equal to the sum of sizeof of each member?

Но для случая, выравнивание целого является 4, поэтому она округляет свой 10 до 12. то есть между пробелами между char[] и int, чтобы убедиться, что целое число начинается с границы 4 байта.

+0

Я понял, что программа работает быстрее из-за этого дополнения, которое выполняется компилятором. Теперь возникает вопрос, как определить, какой номер должен быть указан в адресе, если он отличается от архитектуры? Как и на x86, он должен быть другим, тогда как в некоторой другой архитектуре это должно быть какое-то другое число. –

+0

В C++ 11 вы можете использовать http://en.cppreference.com/w/cpp/language/alignof – Salgar

Смежные вопросы