Объем памяти (char *)

Доброе.Объявляю: char *a;Инициализирую a = new char[6] - если мне надо только 24 байт (девайс вернет 12 байт и мне их сюда надо записать).Смотрю в дебагере. в a идет билиберда на 4 байта.  strlen возвращает 16, sizeof 4.Если выделить char[7] и записать в последний - '\0', то strlen опкажет 12, как и должно быть, а sizeof- 4.Я, конечно понимаю, что sizeof() возвращает мне 4 байта отведенных под указатель.Что мне потом в write передавать, в качестве кол-ва байт необходимых для записи в поток...Чему верить?Спасибо.
14 ответов

вольный перевод:
у меня есть 6 рублей, когда надо 24, 12 из которых я потрачу.смотрю в кошелек после покупки, а там вообще 4р. взвешиваю на весах получаю 16 грамм (4 рубля).если к последней бумажке доложить еще медную пластинку, то взвешивание даст 12 грамм (один фиг 4 рубля).я, конечно, понимаю, что у меня 4 рубля. но ведь взвешивание показывает не то.
если и после этого кто че не поймет - читайте мою подпись 8-)ЗЫ: автору предлагаю сначала поискать там


jonie+1я тоже ничего не понял из поста топикстартера...


Mal Hack, если это у тебя строки,  с нуль символом на конце, тогда используй strlen. Если нет, то 
Что мне потом в write передавать, в качестве кол-ва байт необходимых для записи в поток...
ты же знаешь сколько ты записал в память? столько же передавай и во write.


Прошу прощения за некорректный пост... Бывает.Поясняю.Пусть есть такой код:
char *a, b ,ca = new char[6];b = strlen(a); //24c = sizeof(a); //4a[5] = '\0';b = strlen(a); //5c = sizeof(a); //4
по другому
char *a, b ,ca = new char[7];b = strlen(a); //24c = sizeof(a); //4a[6] = '\0';b = strlen(6); //5c = sizeof(a); //4
Проблема в том, что потом этот указатель идет в функцию, где вызывается write, которому надо в качестве одного из параметров передать кол-во байт, которое надо записать.Собственно вопрос, по sizeof() можно как-ть определить размер значения в байтах, а не размер памяти под сам указатель? Или единственный выход - нулить последний символ С-строки и использовать strlen?


Или единственный выход - нулить последний символ С-строки и использовать strlen?
Если до этого размер не сохранил, то единственный да. Но и то только для ASCII строк.


Если до этого размер не сохранил, то единственный да. Но и то только для ASCII строк. 
Ну а с точки зрения технологии лучше передавать параметр с кол-вом байт которое надо записать?
Но и то только для ASCII строк. 
С-строка в данном случае рассматривается вообще, как byteArray =)


Инициализирую a = new char[6]
Это не инициализация, а выделение памяти, в ней может содержаться любой мусор.
strlen возвращает 16
strlen возвращает количество символов до терминирующего нуля. Я обычно юзаю ZeroMemory после выделения памяти...


Это не инициализация, а выделение памяти, в ней может содержаться любой мусор.
Понятное дело я его потом забиваю нужной информацией.
Я обычно юзаю ZeroMemory после выделения памяти...
Это что?


более безопасный вариант 
std::vector<char> buffer(N);//выделить нужное количество байтDWORD bytes_io = 0;::WriteFile(h_file_, (BYTE*)(&buffer[0]), (DWORD)(buffer.size()), &bytes_io, NULL);


Собственно вопрос, по sizeof() можно как-ть определить размер значения в байтах, а не размер памяти под сам указатель? Или единственный выход - нулить последний символ С-строки и использовать strlen?
Если вопрос звучит как "Можно ли по указателю получиь кол-во байт выделенных под него" то НЕТ, прошу считать это невозможным.
std::vector buffer(N);//выделить нужное количество байтDWORD bytes_io = 0;::WriteFile(h_file_, (BYTE*)(&buffer[0]), (DWORD)(buffer.size()), &bytes_io, NULL);
   Решение идеологически верное. Добавлено @ 09:52
Я обычно юзаю ZeroMemory после выделения памяти...Это что? 
Это зануляет область памяти. см msdn.


1:std::vector buffer(N);//выделить нужное количество байтDWORD bytes_io = 0;::WriteFile(h_file_, (BYTE*)(&buffer[0]), (DWORD)(buffer.size()), &bytes_io, NULL);
wstring buffer;buffer.resize(N);::WriteFile(h_file_, reinterpret_cast<BYTE*>(buffer.c_str()), ... ); 
Все-таки &buffer[0] это слегка хак ;-)А блин, или дело в хранении размера в строке а-ля Паскаль-строки?Есть ещё вариант типа:char *lol = "\003LOL";::WriteFile(h_file, (BYTE*) lol[1], (long) lol[0], ...);


Может остановимсся на vector ?Добавлено @ 09:57
Все-таки &buffer[0] это слегка хак ;-) 
По сравнению с retinterpret_cast'ом из непонятно откуда взявшихся wchar*'ов это никакой не хак.Особенно учитывая что byte суть char.Добавлено @ 09:57Стандарт гарантирует что в векторе элементы лежат последовательно. 


По сравнению с retinterpret_cast'ом из непонятно откуда взявшихся wchar*'ов это никакой не хак.Это вообще ни хак. тем более что BYTE суть char 
Меня гложут сомнения по поводу прямого доступа к данным без ведома vector'a. А если они там лежат не по порядку?Добавлено через 1 минуту и 15 секунд
По сравнению с retinterpret_cast'ом из непонятно откуда взявшихся wchar*'ов это никакой не хак.
С wchar я перемудрил.


А если они там лежат не по порядку? 
Выдыхай. В с++ это невозможно. Слава стандарту 2003