Давайте добавим несколько дополнительных скобок, чтобы продемонстрировать, что происходит
double GetNumber()
{
SkipWhitespaces();
int index = m_Index;
while (isdigit(m_Text[m_Index]))
{ // added brace
m_Index++;
} // added close brace.
if (m_Text[m_Index] == '.')
{ // added brace
m_Index++;
} // added close brace.
while (isdigit(m_Text[m_Index]))
{ // added brace
m_Index++;
} // added close brace.
if (m_Index - index == 0)
{ // added brace
char buffer[32] = { 0 };
} // added close brace.
memcpy(buffer, &m_Text[index], m_Index - index);
return atof(buffer);
}
Как изначально написано, оператор if
не имеет тела, поэтому он принял следующую строку в качестве тела. Поскольку char buffer[32] = { 0 };
является следующей строкой, она становится частью if
и выходит из области видимости, как только выходит if
, к тому моменту, когда memcpy
пытается его использовать, больше не существует.
Я настоятельно рекомендую всегда включать все фигурные скобки во время обучения. Это помогает предотвратить ошибки. Вы можете опустить их позже, если хотите, но я всегда находил для них больше помощи, чем помех.
Решение
Глядя на оригинальный код из исходного блога, я нахожу
if(m_Index - index == 0)
throw ParserException("Number expected but not found!", m_Index);
не
if (m_Index - index == 0)
Добавьте пропущенную строку (желательно вместе с пропущенными фигурными скобками) и char buffer[32] = { 0 };
снова будет в правильной области.