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


Автор: Jlekc 30.6.2006, 17:51
Добрый день, кто может объяснить, почему при динамическом выделении памяти массиву указателей получаеться такая штука:

char* pbuf = new char[20]; 
int size = strlen(pbuf);

printf("size: %d\n",size);
Output:
       size: 32 

Автор: Void 30.6.2006, 18:09
Строка в Си является последовательностью символов (char), оканчивающихся нулевым символом ('\0'). strlen считает длину, сканируя строку до нулевого символа. Память же, выделенная с помощью new или malloc неинициализированна и может содержать все что угодно. strlen, вызванная для такого блока, может вернуть все что угодно или вызвать ошибку обращения к памяти. 

Автор: Jlekc 30.6.2006, 18:11
есть ли возможность получить размер, или надо хранить самому размерность? 

Автор: TeeT 30.6.2006, 18:14
Цитата

Добрый день, кто может объяснить, почему при динамическом выделении памяти массиву указателей получаеться такая штука:

char* pbuf = new char[20]; 
int size = strlen(pbuf);

printf("size: %d\n",size);
Output:
       size: 32  


Помоему потому что строка не инициализирована, попробуй вывести что там - увидешь.
Код

char* pbuf = new char[20]; 

компилятор заполняет при инициализации NULL-ами, заполни сам memset-ом, или лучше в массиве, а можно просто первому элементу присвоить NULL или '\0'

Добавлено @ 18:27 
Цитата

есть ли возможность получить размер, или надо хранить самому размерность?  


теоретически:
Код

int size = sizeof(pbuf)/sizeof(pbuf[0]);


но могут быть подводные камни, не знаю почему, но не всегда работает.
 

Автор: Rockie 30.6.2006, 18:34
Цитата(TeeT @  30.6.2006,  18:14 Найти цитируемый пост)
 а можно просто первому элементу присвоить NULL или '\0'

зачем?

Цитата(Jlekc @  30.6.2006,  18:11 Найти цитируемый пост)
есть ли возможность получить размер, или надо хранить самому размерность? 

не очень понятно что значит самому хранить размерность... ты ее просто знай и с ней дальше и работай:

Код
const int razmer = 20;
char* pbuf = new char[razmer];
 

Автор: Jlekc 30.6.2006, 18:35
то что я ее знаю - я знаю 
мона ли ее получить - вопрос стоял
впринципе не проблема, прост был вопрос 

Автор: TeeT 30.6.2006, 18:39
Rockie
Цитата

зачем?


Ты прав незачем! лучше всей строке и сразу smile  

Автор: Void 30.6.2006, 19:01
Цитата(TeeT @  30.6.2006,  20:39 Найти цитируемый пост)
Ты прав незачем! лучше всей строке и сразу 

В большинстве случаев лучше всего std::string smile 

Автор: Rockie 30.6.2006, 19:27
Цитата(Jlekc @  30.6.2006,  18:35 Найти цитируемый пост)
мона ли ее получить - вопрос стоял

imho нет. нельзя. при выделении памяти в куче компилятор не добавит в конец массива '\0'. Впринцыпе, Void уже исчерпывающе ответил. 
Цитата(Void @  30.6.2006,  19:01 Найти цитируемый пост)
В большинстве случаев лучше всего std::string  

присоединяюсь. к этому надо было прийти =) 

Автор: Earnest 1.7.2006, 18:08
Цитата(TeeT @  30.6.2006,  19:14 Найти цитируемый пост)
теоретически:
код C++
1:
int size = sizeof(pbuf)/sizeof(pbuf[0]);
но могут быть подводные камни, не знаю почему, но не всегда работает.

Всегда работает с массивами, т.е. объявляениями типа int a[100];
Никогда не работает с указателями: int* a = new [100];
В последнем случае sizeof(a) равен размеру указателя (т.е. 4 на 32-разрядной платформах).
В первом случае sizeof(a) равен 100*sizeof(int), но объявление должо быть видимо в точке вызова sizeof. Т.е. если передать массив в функцию, то в ней уже такой фокус не пройдет.
Другими словами, такой метод определяет размер массива только тогда, когда он из без того известен... 

Автор: DeadSoul 1.7.2006, 18:14
Цитата(Jlekc @  30.6.2006,  18:11 Найти цитируемый пост)
есть ли возможность получить размер, или надо хранить самому размерность?  

Хранить самому. Главное - не забыть потом освободить память с помощью delete[]
Цитата(Void @  30.6.2006,  19:01 Найти цитируемый пост)
Цитата(TeeT @  30.6.2006,  20:39 )
Ты прав незачем! лучше всей строке и сразу 
В большинстве случаев лучше всего std::string   

Или std::vector<char>. Многие WinApi-функции требуют непрерывнй буффер.
 

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