我想检查char *是否指向有效的字符串...我可以检查这个变量......
char* c;
我尝试了什么:
if(c == NULL) //c is not null
if(*c == '\0') //false
if(strlen(c) == 0) //exception
我认为在未分配时不可能检查char *并且不指向有效的字符串...
答案 0 :(得分:5)
事实是,你无法确定指针是否有效。测试NULL可能会让您确定它是无效的,但它不保证任何有效性。这是在C ++中不使用这种东西的一个原因。 std::string
总是处于有效状态。
答案 1 :(得分:4)
如果指针不是NULL
,则无法说明指针的值是否有效。
答案 2 :(得分: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;
}
答案 3 :(得分:1)
如果你想要的字符串大小有上限:
char * c = new char[size];
那么也许你可以检查它是否在界限内终止:
bool is_valid(char *c, size_t size) {
while (size--) if (*c) return true;
return false;
}
另一种方法是将char *封装在构造函数的类中,或者在这样的类中使用有效的标志。
答案 4 :(得分:-2)
这取决于操作系统。在Windows下,您有IsBadXxxPtr()
系列函数,它们将测试指向有效内存的指针,尽管它们不会测试指针是否指向特定类型的有效实例。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366713(v=vs.85).aspx 等