Здравствуйте! Спасибо за ответы в предыдущей теме (Часть,Часть2).
Зделал примерно, так:char head[4] = {11,1,0,13};
char cret[4] = {0,1,0,22};char* packet = new char[8];
memcpy(packet,head,sizeof(head)); //копируем head в packet
memcpy(packet+sizeof(head),cret,sizeof(cret)); //присоединяем у packet cretНа выходе получается 11101301022
Но
cout << sizeof(packet) << endl; //Выдает 4Почему 4, а не 8?;
Что я делаю не так?delete packet;
>[оверквотинг удален]
>
>На выходе получается 11101301022
>
>Но
>cout << sizeof(packet) << endl; //Выдает 4
>
>Почему 4, а не 8?;
>Что я делаю не так?
>
>delete packet;
[...]
>char* packet = new char[8];[...]
>cout << sizeof(packet) << endl; //Выдает 4
>
>Почему 4, а не 8?;Вы получили размер указателя. В данном случае, на 32-битной архитектуре, размер указателя равняется размеру типа int и равен 4 байтам.
[...]
>[оверквотинг удален]
>
>[...]
>>cout << sizeof(packet) << endl; //Выдает 4
>>
>>Почему 4, а не 8?;
>
>Вы получили размер указателя. В данном случае, на 32-битной архитектуре, размер указателя
>равняется размеру типа int и равен 4 байтам.
>
>[...]Тогда, как получить размер packet(количество байт)?
[...]
>Тогда, как получить размер packet(количество байт)?При выделении памяти с помощью new использовать переменную, эта переменная и будет размером packet (в случае char, для других типов размер packet будет вычисляться как PACKET_SIZE * sizeof(type)).
const size_t PACKET_SIZE = 8;
char* packet = new char[PACKET_SZIE];
...
cout << PACKET_SIZE << endl;Ну или выделять память не на куче (как делает new), а на стеке. В этом случае можно будет использовать sizeof():
char packet[8];
...
cout << sizeof(packet) << endl;
>[оверквотинг удален]
>...
>cout << PACKET_SIZE << endl;
>
>Ну или выделять память не на куче (как делает new), а на
>стеке. В этом случае можно будет использовать sizeof():
>
>
>char packet[8];
>...
>cout << sizeof(packet) << endl;Спасибо!
И еще вопрос если можно:
1) В каких случаях я должен выделять память в куче, а когда в стеке?
т.е. какие у них +/-, если так можно сказать.
[...]
>1) В каких случаях я должен выделять память в куче, а когда
>в стеке? т.е. какие у них +/-, если так можно сказать.Зависит от задачи. Для больших данных (скажем, огромного массива) память лучше выделять из кучи, а не на стеке, т.к. стек имеет фиксированный размер и обычно не очень велик. Если вы возвращаете указатель на данные, то придётся всегда выделять память на куче, т.к. переменные из стека очищаются (затираются) при выходе из ф-ции. Если всё время выделять память на куче, то весьма возможны утечки памяти, когда вы забудете её освободить (а сборщика мусора в С++ нет), а память выделенная на стеке обычно "освобождается" сама при выходе из ф-ции (области видимости).
Лучше почитать что-нибудь в интернете/книжках на эту тему, ну и конечно же практиковаться.