![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Jlekc |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 520 Регистрация: 10.2.2005 Где: Leopolis Репутация: нет Всего: 4 |
Добрый день, кто может объяснить, почему при динамическом выделении памяти массиву указателей получаеться такая штука:
char* pbuf = new char[20]; int size = strlen(pbuf); printf("size: %d\n",size); Output: size: 32 -------------------- |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Строка в Си является последовательностью символов (char), оканчивающихся нулевым символом ('\0'). strlen считает длину, сканируя строку до нулевого символа. Память же, выделенная с помощью new или malloc неинициализированна и может содержать все что угодно. strlen, вызванная для такого блока, может вернуть все что угодно или вызвать ошибку обращения к памяти.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Jlekc |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 520 Регистрация: 10.2.2005 Где: Leopolis Репутация: нет Всего: 4 |
есть ли возможность получить размер, или надо хранить самому размерность?
-------------------- |
|||
|
||||
TeeT |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 9.12.2005 Где: Нальчик Репутация: нет Всего: нет |
Помоему потому что строка не инициализирована, попробуй вывести что там - увидешь.
компилятор заполняет при инициализации NULL-ами, заполни сам memset-ом, или лучше в массиве, а можно просто первому элементу присвоить NULL или '\0' Добавлено @ 18:27
теоретически:
но могут быть подводные камни, не знаю почему, но не всегда работает. |
||||||||
|
|||||||||
Rockie |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
зачем?
не очень понятно что значит самому хранить размерность... ты ее просто знай и с ней дальше и работай:
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
Jlekc |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 520 Регистрация: 10.2.2005 Где: Leopolis Репутация: нет Всего: 4 |
то что я ее знаю - я знаю
мона ли ее получить - вопрос стоял впринципе не проблема, прост был вопрос Это сообщение отредактировал(а) Jlekc - 30.6.2006, 18:36 -------------------- |
|||
|
||||
TeeT |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 9.12.2005 Где: Нальчик Репутация: нет Всего: нет |
Rockie,
Ты прав незачем! лучше всей строке и сразу ![]() |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
В большинстве случаев лучше всего std::string ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
imho нет. нельзя. при выделении памяти в куче компилятор не добавит в конец массива '\0'. Впринцыпе, Void уже исчерпывающе ответил. присоединяюсь. к этому надо было прийти =) -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Всегда работает с массивами, т.е. объявляениями типа int a[100]; Никогда не работает с указателями: int* a = new [100]; В последнем случае sizeof(a) равен размеру указателя (т.е. 4 на 32-разрядной платформах). В первом случае sizeof(a) равен 100*sizeof(int), но объявление должо быть видимо в точке вызова sizeof. Т.е. если передать массив в функцию, то в ней уже такой фокус не пройдет. Другими словами, такой метод определяет размер массива только тогда, когда он из без того известен... -------------------- ... |
|||
|
||||
DeadSoul |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Хранить самому. Главное - не забыть потом освободить память с помощью delete[]
Или std::vector<char>. Многие WinApi-функции требуют непрерывнй буффер. -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |