2012-04-26 73 views
10

标题可能有点用词不当......只是因为我不确定我的char指针是否指向NULL,或者它是否指向一个大小为0的char数组。如何检查指针是否指向NULL?

所以我有

char* data = getenv("QUERY_STRING"); 

我想检查数据是否为空(或长度为< 1)。我已经试过:

if(strlen(data)<1) 

,但我得到一个错误:

==24945== Invalid read of size 1 
==24945== at 0x8048BF9: main (in /cpp.cgi) 
==24945== Address 0x1 is not stack'd, malloc'd or (recently) free'd 

我也试过

if(data == NULL) 

但具有相同的结果。

这是怎么回事?我已经尝试了与数据cout,并且工作正常。我似乎无法检查它是否为空或空。

我意识到这些是两个不同的东西(空和空)。我想知道哪一个数据会在这里,以及如何检查它是否为空/空。

+2

注意:你应该使用'const char *',而不是'char *'。从[(C++)文档](http://www.cplusplus.com/reference/clibrary/cstdlib/getenv/):'该函数返回的指针所指向的字符串不应该被程序修改。' – Cameron 2012-04-26 20:13:38

回答

21

与getenv,你必须处理这两种情况! (耶!)如果环境变量没有设置,那么函数返回NULL。如果它被设置,那么你得到一个指向它设置的值的指针,它可能是空的。所以:

const char* data = getenv("QUERY_STRING"); 
if (data != NULL && data[0] != '\0') { 
    // Variable is set to value with length > 0 
    // ... 
} 

显然,你需要检查它是否是NULL 试图确定它的长度或读取任何它指向的字符之前 - 为什么在上面if的两个条件是有序的,这是他们的方式。

+3

这可以大大减少到'if(data && * data){...}' – Philip 2012-04-26 20:32:01

+5

@Philip:是的,是的,它可以。但哪一个更具可读性?这是一个意见问题。使用你最喜欢的东西!我个人的偏好是'if(data && data [0]!='\ 0')'。我加了'!= NULL'使我的回答更清晰。 – Cameron 2012-04-26 20:42:59

+0

@Cameron:SO上的一些人宣称有一些平台,其中NULL!= 0。另一方面*“零值,空指针值或空成员指针值被转换为false;”*。这意味着两种检查方式都是有效的。 – SigTerm 2012-04-26 20:54:34

4

通常你会检查这样的事情。第一部分检查指针是否为空,第二部分通过检查每个字符串末尾的空终止符的第一个字符来检查空字符串。

if (data == NULL || data[0] == 0) 

您的问题,看起来像getenvstrlen之间的一些具体的互动,是不是标准。

+0

'getenv'返回一个指向普通的以空字符结尾的C字符串的指针。 'strlen'是为那些类型的字符串而建立的。 – Cameron 2012-04-26 20:11:42

+0

@Cameron:你能想象零长度的C字符串不以'\ 0'开头吗? – SigTerm 2012-04-26 20:14:13

+0

@SigTerm:不可以吗? – Cameron 2012-04-26 20:14:43