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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическом выделении памяти массиву 
:(
    Опции темы
Jlekc
Дата 30.6.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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


--------------------
PM MAIL ICQ   Вверх
Void
Дата 30.6.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
Jlekc
Дата 30.6.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
PM MAIL ICQ   Вверх
TeeT
Дата 30.6.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

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

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


но могут быть подводные камни, не знаю почему, но не всегда работает.
 
PM MAIL   Вверх
Rockie
Дата 30.6.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



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

зачем?

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

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

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Jlekc
Дата 30.6.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



то что я ее знаю - я знаю 
мона ли ее получить - вопрос стоял
впринципе не проблема, прост был вопрос 

Это сообщение отредактировал(а) Jlekc - 30.6.2006, 18:36


--------------------
PM MAIL ICQ   Вверх
TeeT
Дата 30.6.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Rockie
Цитата

зачем?


Ты прав незачем! лучше всей строке и сразу smile  
PM MAIL   Вверх
Void
Дата 30.6.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



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

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Rockie
Дата 30.6.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



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

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

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Earnest
Дата 1.7.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(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. Т.е. если передать массив в функцию, то в ней уже такой фокус не пройдет.
Другими словами, такой метод определяет размер массива только тогда, когда он из без того известен... 


--------------------
...
PM   Вверх
DeadSoul
Дата 1.7.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(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-функции требуют непрерывнй буффер.
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0790 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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