2011-12-06 102 views
1

我要檢查,如果一個char *指向一個有效的字符串...我可以檢查這個變量...C++ - 如何檢查char *是否指向有效的東西?

char* c; 

我的嘗試:

if(c == NULL) //c is not null 
if(*c == '\0') //false 
if(strlen(c) == 0) //exception 

我認爲這是不可能的檢查一個字符*時,它沒有分配,並不指向一個有效的字符串...

+0

爲什麼要檢查一個未初始化的指針的值? –

+1

我解決我的問題有這樣: 的字符*是一個成員變量...所以我在構造函數中指定: 會議::會議() :C(0){} 現在如果字符*沒有分配我可以 如果(0!= C){/ *分配* /} –

回答

4

如果指針不是NULL,沒有辦法說明指針的值是否有效。

+0

檢查它是不是很公平地說,'char',除非初始化或分配,是*始終*無效? – jrok

+1

@jrok:這將取決於char的存儲類,例如:globals和static將被初始化,即使不明確。 –

+0

@Als,謝謝,我糾正了。 – jrok

-2

這取決於操作系統。在Windows下,您有IsBadXxxPtr()函數系列,它將測試指向有效內存的指針,儘管它們不會測試指針是否是特定類型的有效實例。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366713(v=vs.85).aspx

+2

請不要推薦'CrashProgramRandomly'系列函數。 https://blogs.msdn.com/themes/blogs/generic/post.aspx?WeblogApp=oldnewthing&y=2006&m=09&d=27&WeblogPostID=773741&GroupKeys= –

+0

這些功能k.own是危險的。在任何情況下都不要使用它們。 –

5

事實是,你永遠不能肯定一個指針是有效的。測試NULL可能會讓你確定它是無效的,但它不保證任何有效性。這是在C++中不使用這種事情的一個原因。 A std::string總是處於有效狀態。

+0

哦,我寫錯了什麼?或者一個壞主意? –

1

如果你有一個上限字符串的大小,你希望:

char * c = new char[size]; 

那麼也許你可以檢查它是否內綁定終止:

bool is_valid(char *c, size_t size) { 
    while (size--) if (*c) return true; 
    return false; 
    } 

另一種方法是封裝char *在構造函數的類中,或者在這樣的類中擁有有效的標誌。

2

c可以指向任何地方。這可能是空終止的字符串,不終止空字節的字符串,任何可訪問的二進制數據或任何不可訪問的地址。你想要檢查什麼,爲什麼?如果你想區分一個有效的字符串和一個未初始化的字符串,你通常會對未初始化的情況使用NULL,並檢查c == NULL。如果c不是一個有效的指針,訪問* c(strlen也是這樣做)不正確。所以一個典型的用例就是這樣的:

// initializing to NULL 
char *c = NULL; 
// maybe setting value 
if(condition) 
    c = strdup("mein string"); 
// cleanup 
if(c != NULL) { 
    free(c); 
    c = NULL; 
} 
相關問題