Итак, у меня есть структура C++, у которой есть статический массив в качестве члена, и я хочу запросить его размер в конструкторе. Как я понял из этой статьи http://msdn.microsoft.com/en-us/library/4s7x1k91(VS.71).aspx, sizeof можно применить к статическому массиву, чтобы найти размер (в байтах) всего массива, а не только его тип. Однако, когда я делаю sizeof()
на члене, он дает мне 4 (размер указателя) вместо размера массива. Вот контекст (тривиальный):sizeof статический член массива возвращает размер указателя, а не массив
struct A
{
char descirption[128];
int value;
A(const char desc[], int val)
{
size_t charsToCopy = std::min(sizeof(description), sizeof(desc));
memcpy(description, desc, charsToCopy);
value = val;
}
}
int main()
{
A instance("A description string", 1);
//now instance has a description string that says "A des" followed by garbage characters
}
Так как я могу получить размер массива члена полукокса?
Редактировать
Когда я поставил точку останова в компиляторе и инспектировать два значения sizeof(description)
и sizeof(desc)
sizeof(description) == 4
я вижу, и sizeof(desc) == 21
. Отсюда моя путаница. Поскольку я передаю строковый литерал в конструктор, компилятор, кажется, с удовольствием сообщает мне реальный размер переданной строки. Может быть, это не так, если бы я назначил его переменной где-то, но прямо сейчас я Я пытаюсь отследить фундаментальную проблему: sizeof (some-member-static-array) дает мне что-то (относительно) бессмысленное.
Возможно ли, что sizeof выполняет какое-то измерение длины строки, потому что это массив символов?
Знаете ли вы, что 'SizeOf (убывание)' всегда размер указателя, в качестве параметра 'Const символ убывание []' распадается на ' const char * desc'? – dyp
'sizeof (description)' is fine, 'sizeof (desc)' - размер указателя char. Зачем использовать memcpy для копирования строки с нулевым завершением? –
'sizeof (description) == 128',' sizeof (desc) == sizeof (void *) ', что еще вы ожидали? –