2014-09-10 2 views
-2

У меня есть два объекта, заголовок и DF. позволяет говоритьC - Почему мой буфер не печатает правильно?

header = CCCCCC7E

и

DF = 01020304,

значение не должно буфера быть CCCCCC7E01020304?

по какой-то причине, когда я печатал я получил:

7EFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCC00FFFF FFCC00000000000004030201FFFFFF8967341200000000

это, как я печатал:

for (int i = 0; i < sizeof(buffer); i++) 
{ printf("%02X", buffer[i]); } 

это код:

struct Header header; 
    struct Data_Format DF; 
    unsigned char buffer[TOTAL_SIZE]; 

    header.Start = 0x7E; 
    header.Options = 0x00; 
    header.PacketLength = 0x00; 
    header.VCP = 0x00; 
    header.Reserved = 0x00; 
    header.Return = 0x00; 

    DF.Address = 0x01020304; //real value: NULL 
    DF.Result = 0x1234; //real value: NULL 
    DF.Size = 0x6789; //real value: NULL 

    memcpy(buffer,&header, sizeof(Header)); 
    memcpy(buffer+sizeof(Header), &DF, sizeof(Data_Format)); 
+3

Покажите нам код, где 'buffer' объявлен и заполнен –

+0

неполный код не дает представления о конечном выходе. –

+0

Недостаточно кода или информации в вашем вопросе, я предлагаю прочитать [контрольный список вопросов переполнения стека] (http://meta.stackoverflow.com/questions/156810/stack-overflow-question-checklist). Вы также можете узнать, как создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

ответ

1

объекты не обязательно упаковываются вместе. Фактически, большинство компиляторов объединяют объекты с границей 8 байтов, чтобы получить доступ к данным с большей скоростью. Байты между объектами будут просто линизованы неинициализированными (иногда отладочная версия среды выполнения заполняет пробел неверными данными).

1

Это не правильный способ [из-за оптимизации и выравнивания компилятора] для достижения того, чего вы хотите.

Однако, только для логического внушения, в вашем коде, измените

for (int i = 0; i < sizeof(buffer); i++)

в

for (int i = 0; i < (sizeof(Header) + sizeof(Data_Format)); i++).

Это ограничит цикл до действительных записей. Помните, что даже после этого изменения вам не гарантируется [фактически, не предполагается] получить правильный результат.


EDIT

вы можете достичь своей цели с помощью snprintf(). Общее использование выглядит так:

snprintf(buf, sizeof(buf), "%x%x%x", header.start, header.options, DF.size); //incomplete list 
printf("%s", buf); 
+3

Уважаемый Downvoter, не забывайте также оставить комментарий? –

+0

Это скорее комментарий, чем ответ, так как он не решает проблему OP: выход по-прежнему будет «мусором» – Coconop

+0

@Coconop. Спасибо. Просмотрите изменения. –

2

От частичного кода, приведенного в данном документе, не дает большой идеи, но нужно сделать что-то определенное.

Выполняйте memset всегда, прежде чем обращаться в буфер.

Это не позволит вам получить мусор.

+2

Batter это должно быть как комментарий. –

+0

@CakeToppings: upvote, если это помогает. – pradipta

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