如何检查指针是否指向NULL?

var*_*tis 10 c c++ null

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

所以我有

char* data = getenv("QUERY_STRING");
Run Code Online (Sandbox Code Playgroud)

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

if(strlen(data)<1) 
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

==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
Run Code Online (Sandbox Code Playgroud)

我也试过了

if(data == NULL)
Run Code Online (Sandbox Code Playgroud)

但结果相同.

这里发生了什么?我已经尝试过使用数据,这很好用.我似乎无法检查它是否为空或空.

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

Cam*_*ron 21

使用getenv,你必须处理这两种情况!(是的!)如果未设置环境变量,则该函数返回NULL.如果设置了,那么你得到一个指向它设置的值的指针,它可能是空的.所以:

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

显然,尝试确定其长度或读取它指向的任何字符之前,您需要检查它是否为NULL - 这就是为什么上述两个条件按照if它们的顺序排序的原因.

  • @Philip:是的,是的.但哪一个更具可读性?这是一个意见问题.用你最喜欢的!我个人的偏好是`if(data && data [0]!='\ 0')`.我添加了`!= NULL`以使我的答案更清晰. (5认同)
  • 这可以大大简化为`if(data &&*data){...}` (3认同)