спасибо за чтение, мой вопрос, если это правильно закодировано:
test1.cpp:
void Load(OBJECTSTRUCT* gObj)
{
char * VipType = VipTypeCheck(gObj->m_Index);
MsgOutput(gObj->m_Index,"[%s] Welcome",VipType);
}
test2.cpp:
char* VipTypeCheck(int aIndex)
{
switch (VipSystem[aIndex].VIP_Type)
{
case 0:
return "Regular";
break;
case 1:
return "Bronze";
break;
case 2:
return "Gold";
break;
case 3:
return "Diamond";
break;
default:
return "[Error]";
break;
}
return "[Error]";
}
Это работает, но мой вопрос: может ли это привести к ошибке сегментации / переполнению стека или к любому другому виду ошибок? я знаю, что не выделил динамическую память, но я сомневаюсь, что переменная char * VipType в порядке. Спасибо, и извините за вопрос нуба.
Вы хороши — вы возвращаете указатель на постоянную статическую строку, которая выделяется на весь срок действия программы.
Вы можете изменить тип возвращаемого значения как const char *
потому что технически строка не поддается изменению.
Указатели хороши для жизни программы, потому что компилятор помещает их в область, которая гарантированно существует в течение всей жизни программы.
Причины, по которым они не изменяются, в том, что компилятор может стать умным и понять, что в двух местах вы возвращаетесь [Error]
и обратите внимание, что они одинаковы и используют один и тот же указатель для обоих — таким образом, изменение его может вызвать логическую ошибку, потому что один функционал ожидает, что он будет одинаковым, а другой — нет
VipTypeCheck
в test1.cpp
VipTypeCheck
функция должна вернуться const char *
вместо char *
VipType
также должен быть типа const char *
Кроме этого, вы должны быть в порядке: возвращать символьные указатели на строковые литералы можно, потому что они не являются локальными для функции, возвращающей их.
Также рассмотрите возможность упрощения вашей функции с помощью массива, например:
const char *VipTypes[] = {
"Regular", "Bronze", "Gold", "Diamond"};
const char * VipTypeCheck(unsigned int i) {
return i < 4 ? VipTypes[i] : "[Error]";
}