C/C++ структуры

программирование C++

объясните что не так

есть структура:

typedef struct{
char f_name[256];
char format[3];
char orient[5];
unsigned int wi;
unsigned int he;
}imgData;


main(){

imgData img;

strcpy(img.format,"png");

img.wi = 10;

img.he = 5;

printf("{%s} {%i}", img.format, strlen(img.format)); /*выводит правильно, {png} {3}*/

if (img.wi > img.he){ strcpy(img.orient,"land"); }
else if (img.wi < img.he){strcpy(img.orient,"port"); }
else if (img.wi == img.he){ strcpy(img.orient,"equal");}

printf("{%s} {%i}", img.format, strlen(img.format)); /*выводит неправильно, {pngland} {7}*/
}


что не так я делаю со структурой,
как в char format[3]; вписалось 7 символов???
как правильно?
Ответы:
поля структуры в памяти расположены подряд. в этом примере для структуры выделяется  256 + 3 + 5 + sizeof(unsigned int) + sizeof(unsigned int) == 264 (для char) + 8 (? для двух unsigned int) == 272 байта
строка в С является последовательностью байтов, заполненных кодами символов (числами), заканчивающейся нулем.
итого:
0 1 2 3 ... 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
0 0 0 0 ...   0     0     0     p     n     g     0     0     0     0     0     0     0     0    10    0     0     0     5
          f_name              |   format       |   orient                       |   width                |    heigth            |
при выводе format выводит символы, пока не встретит нуль: p n g . все.
Размер поля char[] должен быть как минимум не 1 больше чем самая длинная строка, которую туда предполагается записать


10 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.