2014-02-14 21 views
0

我已經寫一些代碼與VS2013 C++字符串指針,如下:視覺工作室C++空字符串指針

 public struct MyStruct 
      { // some declarations 
      string *MyStrAr[6]; 
      }; 
      // ... some more code 
     MyStruct *AStructNode = new MyStruct; 

用戶給出的輸入的是初始化的Mystringarray的一些繩股和一個值分配給它們。此外在程序中,我想檢查是否已初始化Mystringarray[i]。我曾嘗試以下:

if (AStructNode->MyStrAr[i]==NULL) 
if (AStructNode->MyStrAr[i]->empty()) 
if(*(AStructNode->MyStrAr[i])="") 
if (AStructNode->MyStrAr[i]->_Mysize==); 

第一犯規捕獲任何(字符串是否填充與否),其餘亂扔試圖訪問受保護的內存異常。 我也試過try { } catch(...) {},但也不成功。在發佈此消息之前,請閱讀儘可能多的帖子,我是業餘程序員,讚賞任何幫助/方向。 (我意識到,我可以通過例如聲明一串字符串而不是指針來回避這個問題,但我更願意理解爲什麼,如果我的監督是非常基本的,那就這樣吧!)。如果任何幫助,調試器通常拋出一行的xstring.cpp,那裏說的例外類似 return (this->_Mysize == 0);乾杯,尼科

+0

您不清楚您使用的是哪種語言。無論是C++還是代碼中存在拼寫錯誤,或者是C++/CLI –

+0

嘗試讀取無效內存不會引發異常。所以你的try catch塊在這裏沒有幫助。你需要分配字符串指針。 – doctorlove

+0

@VladfromMoscow我不確定我使用的是哪個版本,我猜它是C++/cli。我怎麼能確定? – nikopkat

回答

0
AStructNode->MyStrAr[i]==NULL 

您還沒有initizlized MyStrAr [I]所以它可能不是空值。

AStructNode->MyStrAr[i]->empty() 

解引用未初始化的指針具有未定義的行爲。

*(AStructNode->MyStrAr[i])="" 

同上。與const char * literal相比(我假設你實際上並不想使用assignement)也不起作用。

AStructNode->MyStrAr[i]->_Mysize== 

與上述兩者相同。

您無法測試值是否未初始化。事實上,你根本不應該讀這樣的記憶。用say,NULL初始化你的值。那麼你的第一次測試AStructNode->MyStrAr[i]==NULL應該只要i <= 5。爲了讓其他測試正常工作,您還需要構建MyStrAr指向的字符串,因爲取消引用NULL指針具有未定義的行爲。

public struct MyStruct 
{ 
    string *MyStrAr[6] = {NULL}; 
}; 

如果你的編譯器不支持撐初始化,你需要使用一個構造函數:

public struct MyStruct 
{ 
    string *MyStrAr[6]; 

    MyStruct(): MyStrAr() {} 
}; 

阿里納斯:是否MyStrAr絕對必須是C風格的數組? std::array有很多優點。如果你的編譯器不支持C++ 11,那麼std::vector也不錯。

+0

好主意;嘗試過,但有一個編譯錯誤; 「不能在數組中指定顯式初始化器」。但我想我可以寫一個小功能來做到這一點。將讓你知道,如果它的工作... – nikopkat

+0

它沒有......花了很多時間試圖解決這個問題,非常感謝:) – nikopkat

0

參數_Mysize對於String類是私有的,所以你沒有權限使用它!如果(AStructNode-> MyStrAr [i] - > size()== ...(某個數字));則可以使用下面的代碼: 代替:

if