Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как узнать текущий размер массива?


Автор: mostly 1.6.2006, 21:01
Код

     unsigned char d[1];
     unsigned char *pc;

    pc=new unsigned char [100];
    pc=&d[0];
        
    for(int i=0;i<100;i++)d[i]=i+1;
    int a=0;
    for(int i=0;i<100;i++)a=a+d[i];
    
    cout<<sizeof(d)<<endl;             // sizeof(d) = 1 = ? ? ?
    
    unsigned char dd[50];
    cout<<sizeof(dd)<<endl;                 // sizeof(dd) = 50 =

    cout<<a<<endl;
    
    delete (pc);



Или я не правильно выделяю память под массив d ? 

Автор: Daevaorn 1.6.2006, 21:12
Цитата(mostly @  1.6.2006,  22:01 Найти цитируемый пост)
Или я не правильно выделяю память под массив d ?  

Всё не правильно!smile

Ты написал:
Цитата(mostly @  1.6.2006,  22:01 Найти цитируемый пост)
unsigned char d[1];

получил:
Цитата(mostly @  1.6.2006,  22:01 Найти цитируемый пост)
sizeof(d) == 1 

И в чем проблема? Хотел массив с одним элементом, его и получил.
Аналогично:
Цитата(mostly @  1.6.2006,  22:01 Найти цитируемый пост)
unsigned char dd[50];
    cout<<sizeof(dd)<<endl; 


Цитата(mostly @  1.6.2006,  22:01 Найти цитируемый пост)
pc=new unsigned char [100];

Пока всё хорошо. Создаешь динамический массив из 100 элементов
Цитата(mostly @  1.6.2006,  22:01 Найти цитируемый пост)
pc=&d[0];

Уже плохо. Не понятно чего хочешь. Память выделенную ранее теряешь вмиг

Цитата(mostly @  1.6.2006,  22:01 Найти цитируемый пост)
 for(int i=0;i<100;i++)d[i]=i+1;
    int a=0;
    for(int i=0;i<100;i++)a=a+d[i];

Не понятно чего хочешь.

Цитата(mostly @  1.6.2006,  22:01 Найти цитируемый пост)
 delete (pc);

Не правильно дважды. По правилам надо delete[], но в твоём случае уже без разницыsmile Скорей всего получаешь AV.

Опиши конкретно чего хочешь добиться
 

Автор: bel_nikita 1.6.2006, 21:14
pc - строится на хипе, а d[1] и dd[50] на стэке

Для стэкового массива:
Код

#define сount_of_array(A)  (sizeof(A)/saizeof(A[0]))

int iArray[100];
double dArray[15];

printf("iArray = %d",сount_of_array(iArray));
printf("dArray = %d",сount_of_array(dArray));


Для хипа - сойздай переменнуб и храни текущие кол-во элементов. 

Автор: mostly 1.6.2006, 21:26
Цитата

Уже плохо. Не понятно чего хочешь. Память выделенную ранее теряешь вмиг

Хочу  создать массив и при необходимости увеличить его.
И как узнать его текущий размер?

А это был просто пример на котором я пытался это сделать.


 

Автор: bel_nikita 1.6.2006, 21:30
mostly, 
для чего нужно? для курсовой какой?
если для себя, то бери готовое std::vector и не парься smile  

Автор: Daevaorn 1.6.2006, 21:41
Цитата(mostly @  1.6.2006,  22:26 Найти цитируемый пост)
Хочу  создать массив и при необходимости увеличить его.
И как узнать его текущий размер?


Код

int size = 100;
T* array = new T[ size ];
// всякие манипуляции с элементами
delete[] array;

Тебе нужно просто кешировать текущий размер массива в отдельной переменной. Если ты хочешь изменить размер массива, то самый простой способ примерно такой:
Код

T* temp = new T[ 150 ];
memcpy( temp, array, size );
delete[] array;
array = temp;
size = 150;

Будет работать для простых типов(int, float и т.д.) 

Автор: Xenon 1.6.2006, 22:08
Ну как и говорили выше делай sizeof(arr)/sizeof(arr[0]) или, я так понимаю, sizeof(arr)/sizeof(типа массива)? 

Автор: mostly 1.6.2006, 22:19
Цитата

для чего нужно? для курсовой какой?
если для себя, то бери готовое std::vector и не парься


Нет, я просто С++ изучаю.
Вектор я знаю, но хотелось бы знать как сделать динамический массив в С++
(как в С делают с использованием malloc). 

Автор: bsa 1.6.2006, 22:41
Цитата(mostly @ 1.6.2006,  22:19)
Нет, я просто С++ изучаю.
Вектор я знаю, но хотелось бы знать как сделать динамический массив в С++
(как в С делают с использованием malloc).

На  C++ делают через вектор или через свою реализацию вектора (только зачем?).
Если тебе хочется также, как и на С, но через new/delete, то замени malloc на new и free на delete[]. Только это глупо, имхо. Да и в C++ нет аналога (мне не известен, по крайней мере) realloc...
Используй вектор или list (если не нужен произвольный доступ к элементам). 

Автор: mostly 2.6.2006, 01:58
Всем спасибо - разобрался. 

Автор: UnrealMan 3.6.2006, 11:31
Иногда можно юзать GlobalAlloc / GlobalReAlloc / GlobalFree / GlobalSize 

Автор: bsa 3.6.2006, 21:11
Цитата(UnrealMan @ 3.6.2006,  11:31)
Иногда можно юзать GlobalAlloc / GlobalReAlloc / GlobalFree / GlobalSize

Речь идет о Windows?!?
На сколько я знаю, в стандарт C/C++ не входят данных функции. 

Автор: UnrealMan 3.6.2006, 22:02
Цитата(bsa @  3.6.2006,  21:11 Найти цитируемый пост)
Речь идет о Windows?!?

Естес-но :-)

Можно ещё использовать AllocMemory / ReallocMemory / FreeMemory / MemorySize. Правда для этого библиотека bhsupp.dll понадобится.

При компиляции в VC6.0 замечал, что при использовании и того и другого имеет место меньший по сравнению с malloc / new расход памяти при выделении небольших объёмов (несколько байт). К тому же GlobalSize и MemorySize позволяют узнать размер выделенной памяти (правда он не всегда совпадает с размером, указанным при выделении).

Разумеется, есть и более продвинутые способы, но они и не такие простые в применении. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)