感谢阅读,我的问题是,如果这是正确编码的:
test1.cpp:
void Load(OBJECTSTRUCT* gObj)
{
char * VipType = VipTypeCheck(gObj->m_Index);
MsgOutput(gObj->m_Index,"[%s] Welcome",VipType);
}
测试2.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是否正常。谢谢,对noob问题感到抱歉。
答案 0 :(得分:3)
你很好 - 你正在返回一个指向为程序生命周期分配的const静态字符串的指针。
您可能希望将返回类型更改为const char *
,因为从技术上讲,字符串是不可修改的。
指针有利于程序的生命周期,因为编译器将这些指针放入一个保证在程序生命周期内存在的区域。
它们不可修改的原因是因为编译器可能变得聪明并且意识到在两个地方你返回[Error]
并注意它们是相同的并且对两者都使用相同的指针 - 所以修改它可能会导致逻辑错误因为一个func期望它是相同的而另一个不是
答案 1 :(得分:1)
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]";
}