10

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

所以我有

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,效果很好。我似乎无法检查它是空的还是空的。

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

4

2 回答 2

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它们的顺序排列的原因。

于 2012-04-26T20:06:29.893 回答
4

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

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

您的问题看起来像是之间的一些特定交互getenvstrlen这不是标准的。

于 2012-04-26T20:09:53.107 回答