2012-09-04 171 views
1

感谢您的阅读,我的问题是,如果这是正确编码:字符返回函数指针C++

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

的可能重复(http://stackoverflow.com/questions/ 1588976/do-pointers-to-string-literals-remain-valid-after-a-function-returns) –

+1

在交换机返回后,你并不需要休息。很多编译器会对此提出警告。 –

回答

3

你是好样 - 你是一个指针返回到被分配给程序的生命常量静态字符串。

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

指针有利于程序的寿命,因为编译器把它们转变成能够被保证程序的生命存在的区域。

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

1
  • 您需要在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]"; 
} 
+0

使它成为一个阵列可能会导致超出限制的问题 - switch语句恕我直言,是更好,因为它会一直工作 –

+1

@AdrianCornish这就是条件是什么(也注意到无符号的类型,消除负面指标的可能性)。 – dasblinkenlight

+0

错过了 - 你完全正确 –