1

感谢阅读,我的问题是这是否正确编码:

测试1.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 是否可以。谢谢,对菜鸟问题感到抱歉。

4

2 回答 2

3

你很好 - 你正在返回一个指向为程序生命周期分配的 const 静态字符串的指针。

您可能想要更改返回类型,const char *因为从技术上讲,字符串是不可修改的。

指针对程序的生命周期有好处,因为编译器将它们放入一个保证程序生命周期存在的区域。

它们不可修改的原因是因为编译器可能变得聪明并意识到在两个地方你返回[Error]并注意到它们是相同的并且对两者使用相同的指针 - 所以修改它可能会导致逻辑错误,因为一个 func 期望它是相同,另一个不

于 2012-09-04T00:38:40.287 回答
1
  • 您需要VipTypeChecktest1.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]";
}
于 2012-09-04T00:42:18.663 回答