Указатель на функцию возврата символа Переполнение стека

спасибо за чтение, мой вопрос, если это правильно закодировано:

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 в порядке. Спасибо, и извините за вопрос нуба.

1

Решение

Вы хороши — вы возвращаете указатель на постоянную статическую строку, которая выделяется на весь срок действия программы.

Вы можете изменить тип возвращаемого значения как const char * потому что технически строка не поддается изменению.

Указатели хороши для жизни программы, потому что компилятор помещает их в область, которая гарантированно существует в течение всей жизни программы.

Причины, по которым они не изменяются, в том, что компилятор может стать умным и понять, что в двух местах вы возвращаетесь [Error] и обратите внимание, что они одинаковы и используют один и тот же указатель для обоих — таким образом, изменение его может вызвать логическую ошибку, потому что один функционал ожидает, что он будет одинаковым, а другой — нет

3

Другие решения

  • Вам нужно добавить прототип для 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]";
}
1

По вопросам рекламы [email protected]