【问题标题】:Character return function pointer C++字符返回函数指针 C++
【发布时间】:2012-09-04 00:36:25
【问题描述】:

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

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 是否可以。谢谢,很抱歉这个菜鸟问题。

【问题讨论】:

标签: c++ function pointers character


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:
    • 您需要在test1.cpp 中添加VipTypeCheck 的原型
    • 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]";
    }
    

    【讨论】:

    • 将其设为数组可能会导致越界问题 - 恕我直言,switch 语句更好,因为它始终有效
    • @AdrianCornish 这就是条件的作用(还要注意无符号类型,消除负索引的可能性)。
    猜你喜欢
    • 2011-01-21
    • 2018-03-23
    • 1970-01-01
    • 2021-03-16
    • 2010-12-25
    • 2012-11-12
    • 1970-01-01
    • 2012-02-26
    • 2020-04-29
    相关资源
    最近更新 更多