2012-09-04 172 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

錯過了 - 你完全正確 –