10

タイトルは少し誤称かもしれません...私のcharポインタがNULLを指しているのか、それともサイズ0のchar配列を指しているのかわからないからです。

ので、私は持っています

char* data = getenv("QUERY_STRING");

そして、データがnull(または長さ<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を試しましたが、それは問題なく機能します。nullか空かを確認できないようです。

私はこれらが2つの異なるもの(nullと空)であることを理解しています。ここにあるデータと、それがnull/空かどうかを確認する方法を知りたいです。

4

2 に答える 2

21

getenvでは、両方のケースを処理する必要があります。(Yay!)環境変数が設定されていない場合、関数はNULLを返します。設定されている場合は、設定されている値へのポインタを取得します。これは空の場合があります。それで:

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

明らかに、長さを決定したり、指している文字を読み取ったりする前に、NULLかどうかを確認する必要があります。これが、上記の2つの条件がifそのまま順序付けられている理由です。

于 2012-04-26T20:06:29.893 に答える
4

通常、このようなもので確認します。最初の部分はポインタのnullをチェックし、2番目の部分はすべての文字列の最後にあるnullターミネータの最初の文字をチェックすることによって空の文字列をチェックします。

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

あなたの問題は、との間の特定の相互作用のように見えますがgetenvstrlenそれは標準ではありません。

于 2012-04-26T20:09:53.107 に答える