| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||||||||
Помоему потому что строка не инициализирована, попробуй вывести что там - увидешь.
компилятор заполняет при инициализации NULL-ами, заполни сам memset-ом, или лучше в массиве, а можно просто первому элементу присвоить NULL или '\0' Добавлено @ 18:27
теоретически:
но могут быть подводные камни, не знаю почему, но не всегда работает. |
| Автор: Jlekc 30.6.2006, 18:35 |
| то что я ее знаю - я знаю мона ли ее получить - вопрос стоял впринципе не проблема, прост был вопрос |
| Автор: TeeT 30.6.2006, 18:39 | ||
Rockie,
Ты прав незачем! лучше всей строке и сразу |
| Автор: Void 30.6.2006, 19:01 |
В большинстве случаев лучше всего std::string |
| Автор: Rockie 30.6.2006, 19:27 |
imho нет. нельзя. при выделении памяти в куче компилятор не добавит в конец массива '\0'. Впринцыпе, Void уже исчерпывающе ответил. присоединяюсь. к этому надо было прийти =) |
| Автор: Earnest 1.7.2006, 18:08 | ||
Всегда работает с массивами, т.е. объявляениями типа int a[100]; Никогда не работает с указателями: int* a = new [100]; В последнем случае sizeof(a) равен размеру указателя (т.е. 4 на 32-разрядной платформах). В первом случае sizeof(a) равен 100*sizeof(int), но объявление должо быть видимо в точке вызова sizeof. Т.е. если передать массив в функцию, то в ней уже такой фокус не пройдет. Другими словами, такой метод определяет размер массива только тогда, когда он из без того известен... |
| Автор: DeadSoul 1.7.2006, 18:14 | ||||
Хранить самому. Главное - не забыть потом освободить память с помощью delete[]
Или std::vector<char>. Многие WinApi-функции требуют непрерывнй буффер. |