Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Размер массива

4.5K
06 октября 2006 года
e-XperT
127 / / 04.07.2006
Как получить размер массива?
 
Код:
char *Msg;
Msg = new char[10];
Msg = "aggfhfhgha";
int size = sizeof Msg;

size все время равно 4.
242
06 октября 2006 года
Оlga
2.2K / / 04.02.2006
 
Код:
#include <string.h>
//..............
int size = strlen(Msg) ;
16K
06 октября 2006 года
Deeoni$
21 / / 09.06.2006
или так
 
Код:
int size = sizeof(*Msg);
5.4K
07 октября 2006 года
Svyatozar
221 / / 11.09.2006
Да нельзя узнать размер массива по указателю.

strlen возвращает только длину строки до первого '\0', но не размер выделенной памяти

sizeof(*Msg) вернет размер char, то есть 1

А это что такое:
Msg = "aggfhfhgha";
Ты осознаешь что тут указателю Msg присваевается новое значение соответствующее адресу строки "aggfhfhgha" ? Выделенная под массив память теряется...

Размеры массивов надо все время носить вместе с указателем. Можно их помещать в структуру, но за ним надо постоянно следить в C/C++
309
07 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Размер объекта/массива по его указателю определить можно.
Для этого используется функция _msize.
А sizeof для указателя всегда будет 4 байта.
5.4K
07 октября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=el scorpio]Размер объекта/массива по его указателю определить можно.
Для этого используется функция _msize.
[/QUOTE]

Так ли?

У меня в Линуксе нету _msize. Но мне любопытно, что Мелкомягкие вернут в таком примере:

#include <malloc.h>
int main() {
char *Msg = "aggfhfhgha";
int size = _msize(Msg);
return size;
}
309
07 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Размер области памяти, выделенной под объект (массив объектов) в байтах
5.4K
07 октября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=el scorpio]Размер области памяти, выделенной под объект (массив объектов) в байтах[/QUOTE]
да не, ты мне число скажи. Какое число выводит программа?
3
07 октября 2006 года
Green
4.8K / / 20.01.2000
Svyatozar прав, _msize - исключительно приблуда MS, я бы не стал её широко использовать.
В общем случае стандартными средствами размер динамически выделенного массива не определить.

Вопрос к автору топика: для чего тебе нужно вычислять размер массива, если ты его сам же и задаешь?
Другими словами, почему бы не так:
 
Код:
int size = 10;
char* Msg = new char[size];
4.5K
07 октября 2006 года
e-XperT
127 / / 04.07.2006
[QUOTE=Green]
Вопрос к автору топика: для чего тебе нужно вычислять размер массива, если ты его сам же и задаешь?
[/code][/QUOTE]
В MSDN для определения статических переменных используют sizeof, но для динамических эта функция не работает. А приведенный код просто пример. На самом деле указатель на массив передается в функцию. Вот и возник вопрос как определять размер строки содержащейся в массиве.
309
07 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Svyatozar]да не, ты мне число скажи. Какое число выводит программа?[/QUOTE]
Размер в байтах, что тут непонятного.
Кстати, забыл указать - _msize имеет ряд ограничений (применительно к Borland C++ Builder).
Во-первых, не совсем корректно работает для памяти, выделенной оператором new (new[]) - CodeGuard информирует об ошибке "несовпадения типов ресурсов"
Во-вторых, реальный размер массива увеличивается на некоторую величину (4 байта) - то есть, если массив типа int состоит из 10 элементов, то размер его будет 44.
3
07 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=e-XperT]В MSDN для определения статических переменных используют sizeof, но для динамических эта функция не работает.
[/QUOTE]
sizeof - это не функция, а оператор языка, результатом которого является размер в байтах для определенного типа.
Тип Msg в твоем примере это char*, т.е. как указатель для него требуется 4 байта.
Обработка sizeof идет на этапе компиляции, а не в процессе выполнения программы. Так что про какую "динамику" можно говорить...

[QUOTE=e-XperT]
А приведенный код просто пример. На самом деле указатель на массив передается в функцию. Вот и возник вопрос как определять размер строки содержащейся в массиве.[/QUOTE]
Если это строка, то она может быть C-string, т.е. завершаться нулем, по которому и можно определить размер строки.
Иначе можно просто передавать в тво функцию не только указатель на буфер, но и размер этого самого буфера.
3
07 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=el scorpio]Размер в байтах, что тут непонятного.
Кстати, забыл указать - _msize имеет ряд ограничений
<skip>
[/QUOTE]
Короче, грязный хак... :)
309
08 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Green]Короче, грязный хак... :)[/QUOTE]
Скорее всего, функция просто учитывает размер "служебной" информации, которая находится перед объектом. Может быть?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог