char *Msg;
Msg = new char[10];
Msg = "aggfhfhgha";
int size = sizeof Msg;
Размер массива
Код:
size все время равно 4.
Код:
#include <string.h>
//..............
int size = strlen(Msg) ;
//..............
int size = strlen(Msg) ;
Код:
int size = sizeof(*Msg);
strlen возвращает только длину строки до первого '\0', но не размер выделенной памяти
sizeof(*Msg) вернет размер char, то есть 1
А это что такое:
Msg = "aggfhfhgha";
Ты осознаешь что тут указателю Msg присваевается новое значение соответствующее адресу строки "aggfhfhgha" ? Выделенная под массив память теряется...
Размеры массивов надо все время носить вместе с указателем. Можно их помещать в структуру, но за ним надо постоянно следить в C/C++
Для этого используется функция _msize.
А sizeof для указателя всегда будет 4 байта.
Для этого используется функция _msize.
[/QUOTE]
Так ли?
У меня в Линуксе нету _msize. Но мне любопытно, что Мелкомягкие вернут в таком примере:
#include <malloc.h>
int main() {
char *Msg = "aggfhfhgha";
int size = _msize(Msg);
return size;
}
Размер области памяти, выделенной под объект (массив объектов) в байтах
да не, ты мне число скажи. Какое число выводит программа?
В общем случае стандартными средствами размер динамически выделенного массива не определить.
Вопрос к автору топика: для чего тебе нужно вычислять размер массива, если ты его сам же и задаешь?
Другими словами, почему бы не так:
Код:
int size = 10;
char* Msg = new char[size];
char* Msg = new char[size];
Вопрос к автору топика: для чего тебе нужно вычислять размер массива, если ты его сам же и задаешь?
[/code][/QUOTE]
В MSDN для определения статических переменных используют sizeof, но для динамических эта функция не работает. А приведенный код просто пример. На самом деле указатель на массив передается в функцию. Вот и возник вопрос как определять размер строки содержащейся в массиве.
Размер в байтах, что тут непонятного.
Кстати, забыл указать - _msize имеет ряд ограничений (применительно к Borland C++ Builder).
Во-первых, не совсем корректно работает для памяти, выделенной оператором new (new[]) - CodeGuard информирует об ошибке "несовпадения типов ресурсов"
Во-вторых, реальный размер массива увеличивается на некоторую величину (4 байта) - то есть, если массив типа int состоит из 10 элементов, то размер его будет 44.
[/QUOTE]
sizeof - это не функция, а оператор языка, результатом которого является размер в байтах для определенного типа.
Тип Msg в твоем примере это char*, т.е. как указатель для него требуется 4 байта.
Обработка sizeof идет на этапе компиляции, а не в процессе выполнения программы. Так что про какую "динамику" можно говорить...
[QUOTE=e-XperT]
А приведенный код просто пример. На самом деле указатель на массив передается в функцию. Вот и возник вопрос как определять размер строки содержащейся в массиве.[/QUOTE]
Если это строка, то она может быть C-string, т.е. завершаться нулем, по которому и можно определить размер строки.
Иначе можно просто передавать в тво функцию не только указатель на буфер, но и размер этого самого буфера.
Кстати, забыл указать - _msize имеет ряд ограничений
<skip>
[/QUOTE]
Короче, грязный хак... :)
Скорее всего, функция просто учитывает размер "служебной" информации, которая находится перед объектом. Может быть?