-2

これは、戻り文字列が空かどうかをテストする唯一の方法です。それぞれが他方のアーキテクチャで失敗します。問題はなぜですか?!=NULLが x86 で_tcslen(*sDateOut)>0失敗し、x64で失敗するのはなぜですか?:

BOOL FormatDate(TCHAR *sIn, TCHAR **sOut) {
free(*sOut);*sOut=NULL; // Clear

...
if (condition1)
    *sOut = calloc(length,sizeof(TCHAR);
...

#ifdef WIN64
    return (*sOut != NULL);
#else
    return (_tcslen(*sOut)>0);
#endif
}
4

4 に答える 4

2

空の文字列をチェックしたい場合は、最初の文字を'\0'ではなく NULLと比較する必要があります。

これは、 が null ポインターを表すと想定されているためNULLです。実際の値は実際にはゼロではない可能性があります。


例に戻ると、 がTCHAR **sOut空の文字列への有効なポインターであるかどうかをテストする場合、このテストは機能するはずです。

if (sOut && *sOut && (*sOut)[0] != _T('\0')) {
    // non-empty
} else {
    // empty or invalid pointer
}
于 2012-04-24T10:22:53.080 に答える
1

実際には、どちらもまったく異なることを行います。

(*sOut != NULL)

sOutがへの有効なポインタを指している場合は常に trueですchar。それが指す文字列の長さがゼロという意味ではなく、文字列がないという意味です。

(_tcslen(*sOut)>0)

一方、文字列が*sOut指す長さを実際にチェックし、あると仮定します。

したがって、チェックを組み合わせて、*sOutゼロ以外の長さのヌル終了文字列であることを確認する必要があります。

(*sOut != NULL) && (_tcslen(*sOut)>0)

関数のシグネチャは、 に何かを入れることになっているように見えることに注意してください。そのsOutため、長さゼロの文字列をテストしても意味がありません。私はあなたが何をしているのか知っていると思います。

于 2012-04-24T10:31:26.973 に答える
1

sOut は typeTCHAR **であるため、*sOut は文字ではなくポインタです。

2 つのテストは、異なることをチェックしています。

*sOut != NULL; // is the pointer NULL?

_tcslen(*sOut)>0; // does the pointer point to a zero-length string? (presumes pointer is non-NULL!)

WIN64 とその他で 2 つの異なることをチェックする理由は、このサンプルからは明らかではありません。

于 2012-04-24T10:31:37.990 に答える
0

あなたにとって「空文字列」とは何ですか?Null-Pointer とサイズがゼロの文字列は別物です。サイズがゼロの文字列へのポインタが NULL ではありません。正しいコードは両方の状況をチェックする必要があります:

((*sOut !=NULL) && (_tcslen(*sOut)>0))

于 2012-04-24T10:30:42.577 に答える