The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"char,0,sizeof Часть3"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"char,0,sizeof Часть3"  
Сообщение от Fisher (??) on 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;

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "char,0,sizeof Часть3"  
Сообщение от phpcoder email(??) on 04-Фев-08, 07:21 
[...]
>char* packet = new char[8];

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

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

[...]


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "char,0,sizeof Часть3"  
Сообщение от phpcoder email(??) on 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;

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

Спасибо!

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру