2015-01-29 2 views
-1

Я новичок в C++ и программировании, и я хотел бы знать, есть ли способ получить длину указателя.
Скажем, Myheader - это структура с различными типами данных внутри.
Мой код выглядит следующим образом:Хотите знать длину буфера C++

char *pStartBuffer; 
memcpy(pStartBuffer, &MyHeader, MyHeader.u32Size); 

Так что я хочу знать длину буфера, так что я могу скопировать данные в файл с помощью функции записи QT.

file.write(pStartBuffer, length(pStartBuffer)); 

Как это сделать?

+0

Я надеюсь, что ваш реальный код выделяет память для 'pStartBuffer'? –

+3

И нет, нет стандартного способа узнать длину памяти, на которую указывает указатель. Вы должны сами отслеживать это. –

+0

Не используйте буфер 'char' в первую очередь. Используйте 'std :: string', и ничто из этого не будет проблемой. –

ответ

1

Указатели не знают свой выделенный размер.

Вы можете использовать std::vector которые отслеживать размер для вас:

std::vector<char> pStartBuffer(MyHeader.u32Size); 
memcpy(pStartBuffer, &MyHeader, MyHeader.u32Size); 

И последнее:

file.write(pStartBuffer.data(), pStartBuffer.size()); 
1

Невозможно найти длину буфера, заданную только указателем. Если вы определите, это строка, в которой вы можете использовать одну из функций длины строки или вы можете сами отслеживать длину буфера.

0

Указатель не имеет «длины». Вам нужна длина массива, на который указывает указатель.

Нет, вы не можете извлечь эту информацию из указателя.

Если массив содержит действительную, заканчивающийся нуль строку символов, то вы можете получить длину этой строки итерации, пока вы не найдете нулевой символ, который является тем, что делает strlen.

Если нет, то, что вы обычно делаете, вы храните длину в переменной при распределении массива. Это одна из вещей, которые std::vector или std::string сделают для вас, в зависимости от того, что больше подходит для вашего использования.

Смежные вопросы