C++ C++;-如何检查char*是否指向有效的内容?

C++ C++;-如何检查char*是否指向有效的内容?,c++,char,C++,Char,我想检查char*是否指向有效字符串…我可以检查此变量吗 char* c; 我尝试的是: if(c == NULL) //c is not null if(*c == '\0') //false if(strlen(c) == 0) //exception 我认为不可能在未分配字符*时检查字符*并且不指向有效字符串…如果指针不是NULL,则无法判断指针的值是否有效。如果指针不是NULL,无法判断指针的值是否有效。这取决于操作系统。在Windows下,您有IsBadXxxPtr()函数族,

我想检查char*是否指向有效字符串…我可以检查此变量吗

char* c;
我尝试的是:

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

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

如果指针不是
NULL
,则无法判断指针的值是否有效。

如果指针不是
NULL
,无法判断指针的值是否有效。

这取决于操作系统。在Windows下,您有
IsBadXxxPtr()
函数族,它将测试指向有效内存的指针,尽管它们不会测试指针是否指向特定类型的有效实例


等等。

这取决于操作系统。在Windows下,您有
IsBadXxxPtr()
函数系列,它将测试指向有效内存的指针,尽管它们不会测试指针是否指向特定类型的有效实例


等等。

事实是,你永远无法确定指针是否有效。测试NULL可能会让您确定它是无效的,但它不能保证任何有效性。这就是为什么不在C++中使用这种东西的原因之一。
std::string
始终处于有效状态。

事实是,您永远无法确定指针是否有效。测试NULL可能会让您确定它是无效的,但它不能保证任何有效性。这就是为什么不在C++中使用这种东西的原因之一。
std::string
始终处于有效状态。

如果您对所需字符串的大小有上限:

char * c = new char[size];
然后,也许您可以检查它是否在边界内终止:

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

另一种方法是将char*封装在构造函数中的类中,或者在此类中使用有效标志。

如果您对所需字符串的大小有上限:

char * c = new char[size];
然后,也许您可以检查它是否在边界内终止:

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

另一种方法是将char*封装在构造函数中的类中,或者在这样的类中使用有效标志。

c可以指向任何地方。这可能是以null结尾的字符串、没有以null字节结尾的字符串、任何可访问的二进制数据或任何不可访问的地址。你到底想检查什么?为什么?如果要区分有效字符串和未初始化字符串,通常会对未初始化的情况使用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;
}

c可以指向任何地方。这可能是以null结尾的字符串、没有以null字节结尾的字符串、任何可访问的二进制数据或任何不可访问的地址。你到底想检查什么?为什么?如果要区分有效字符串和未初始化字符串,通常会对未初始化的情况使用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;
}

为什么要检查未初始化指针的值?我用这种方法解决了我的问题:char*是一个成员变量…所以我在构造函数中指定了:Session::Session():c(0){},现在如果char*没有分配,我可以用(0!=c){/*分配了*/}来检查它为什么要检查未初始化指针的值呢?我用这种方法解决了我的问题:char*是一个成员变量…所以我在构造函数中指定了:Session::Session():c(0){},现在如果char*没有分配,我可以用(0!=c){/*分配了*/}来检查它。说
char
,这不公平吗,除非初始化或分配给,否则总是无效的?@jrok:这取决于字符的存储类,例如:全局和静态将被初始化,即使没有明确说明。公平地说,
char
,除非初始化或分配给,总是无效的吗?@jrok:这将取决于字符的存储类,例如:全局和静态将被初始化,即使没有明确说明。请不要推荐
crashprogram随机
函数系列。这些功能被认为是危险的。在任何情况下都不要使用它们。请不要推荐
crashprogrammandomy
函数系列。这些功能被认为是危险的。在任何情况下都不要使用它们。