URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7150
[ Назад ]

Исходное сообщение
"char,0,sizeof Часть3"

Отправлено Fisher , 04-Фев-08 07:04 
Здравствуйте! Спасибо за ответы в предыдущей теме (Часть,Часть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;


Содержание

Сообщения в этом обсуждении
"char,0,sizeof Часть3"
Отправлено slava.semushingmail.com , 04-Фев-08 07:19 
>[оверквотинг удален]
>
>На выходе получается 11101301022
>
>Но
>cout << sizeof(packet) << endl; //Выдает 4
>
>Почему 4, а не 8?;
>Что я делаю не так?
>
>delete packet;


"char,0,sizeof Часть3"
Отправлено phpcoder , 04-Фев-08 07:21 
[...]
>char* packet = new char[8];

[...]
>cout << sizeof(packet) << endl; //Выдает 4
>
>Почему 4, а не 8?;

Вы получили размер указателя. В данном случае, на 32-битной архитектуре, размер указателя равняется размеру типа int и равен 4 байтам.

[...]



"char,0,sizeof Часть3"
Отправлено Fisher , 04-Фев-08 07:31 
>[оверквотинг удален]
>
>[...]
>>cout << sizeof(packet) << endl; //Выдает 4
>>
>>Почему 4, а не 8?;
>
>Вы получили размер указателя. В данном случае, на 32-битной архитектуре, размер указателя
>равняется размеру типа int и равен 4 байтам.
>
>[...]

Тогда, как получить размер packet(количество байт)?


"char,0,sizeof Часть3"
Отправлено phpcoder , 04-Фев-08 07:42 
[...]
>Тогда, как получить размер 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;


"char,0,sizeof Часть3"
Отправлено Fisher , 04-Фев-08 07:56 
>[оверквотинг удален]
>...
>cout << PACKET_SIZE << endl;
>
>Ну или выделять память не на куче (как делает new), а на
>стеке. В этом случае можно будет использовать sizeof():
>
>
>char packet[8];
>...
>cout << sizeof(packet) << endl;

Спасибо!

И еще вопрос если можно:

1) В каких случаях я должен выделять память в куче, а когда в стеке?
т.е. какие у них +/-, если так можно сказать.


"char,0,sizeof Часть3"
Отправлено phpcoder , 04-Фев-08 10:59 
[...]
>1) В каких случаях я должен выделять память в куче, а когда
>в стеке?  т.е. какие у них +/-, если так можно сказать.

Зависит от задачи. Для больших данных (скажем, огромного массива) память лучше выделять из кучи, а не на стеке, т.к. стек имеет фиксированный размер и обычно не очень велик. Если вы возвращаете указатель на данные, то придётся всегда выделять память на куче, т.к. переменные из стека очищаются (затираются) при выходе из ф-ции. Если всё время выделять память на куче, то весьма возможны утечки памяти, когда вы забудете её освободить (а сборщика мусора в С++ нет), а память выделенная на стеке обычно "освобождается" сама при выходе из ф-ции (области видимости).

Лучше почитать что-нибудь в интернете/книжках на эту тему, ну и конечно же практиковаться.