C ++ - 如何检查char *是否指向有效的东西?

时间:2011-12-06 11:05:45

标签: c++ char

我想检查char *是否指向有效的字符串...我可以检查这个变量......

char* c;

我尝试了什么:

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

我认为在未分配时不可能检查char *并且不指向有效的字符串...

5 个答案:

答案 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