Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать текущий размер массива? Если массив был динамически увеличен. 
:(
    Опции темы
mostly
Дата 1.6.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 29.3.2006

Репутация: нет
Всего: нет



Код

     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 ? 
PM MAIL   Вверх
Daevaorn
Дата 1.6.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(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.

Опиши конкретно чего хочешь добиться
 
PM MAIL WWW   Вверх
bel_nikita
Дата 1.6.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



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));


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


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
mostly
Дата 1.6.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 29.3.2006

Репутация: нет
Всего: нет



Цитата

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

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

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


 
PM MAIL   Вверх
bel_nikita
Дата 1.6.2006, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



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


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 1.6.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(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 и т.д.) 
PM MAIL WWW   Вверх
Xenon
Дата 1.6.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



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


--------------------
user posted image  
PM MAIL   Вверх
mostly
Дата 1.6.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 29.3.2006

Репутация: нет
Всего: нет



Цитата

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


Нет, я просто С++ изучаю.
Вектор я знаю, но хотелось бы знать как сделать динамический массив в С++
(как в С делают с использованием malloc). 
PM MAIL   Вверх
bsa
Дата 1.6.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

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


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 29.3.2006

Репутация: нет
Всего: нет



Всем спасибо - разобрался. 
PM MAIL   Вверх
UnrealMan
Дата 3.6.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Иногда можно юзать GlobalAlloc / GlobalReAlloc / GlobalFree / GlobalSize 
PM MAIL   Вверх
bsa
Дата 3.6.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

Речь идет о Windows?!?
На сколько я знаю, в стандарт C/C++ не входят данных функции. 
PM   Вверх
UnrealMan
Дата 3.6.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



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

Естес-но :-)

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

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

Разумеется, есть и более продвинутые способы, но они и не такие простые в применении. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1147 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.