7

私は本Cracking the Coding インタビュー(Q 1.2) で問題の解決策を読んでいます。ここでの目的は、null 終端文字列を逆にする関数void revers(char* str)を C で実装することです。

ソリューション コードは次のようになります。

void reverse(char *str)
{
   char* end=str;
   char tmp;
   if(str)
   {
       while(*end)
       {
          end++;
       }
       end--;
       //code to reverse
   }
}

ここにstr、住所が含まれていますよね?そして、 isの場合if(str)にのみ評価されますよね?falsestr0

だから私が言っているのはstr、アドレスが含まれている0x0000可能if(str)性はありませfalseん。

4

10 に答える 10

5
if(str)

と同等です

if(str != NULL)

また

if(str != 0)

このテストはstrが のアドレスを持っているかどうかをテストするのではなく、 がヌル ポインタである0かどうかをテストします。str

null ポインターは address を持つ必要がないことに注意してください0。標準では、null ポインターが他の null 以外のポインターと等しくないことのみが保証されます。

C11 6.3.2.3ポインター

値が 0 の整数定数式、または型 void * にキャストされたそのような式は、ヌル ポインター定数と呼ばれます。オブジェクトまたは関数へのポインタと等しくないことが保証されています。

于 2013-07-22T08:38:33.037 に答える
2

関数にポインターを渡さない限りNULL、そのような可能性はありません。

C では、C99 で導入されるまでブール型はありませんでした。論理演算 (条件を含む) は、実数型に関係なく、値をゼロに対してチェックします。

于 2013-07-22T08:35:24.090 に答える
2

つまり、str にアドレス 0x0000 が含まれ、if(str) が false と評価される可能性はありませんか?

はい、あります。null ポインターで呼び出している場合はreverse()、false と評価されます。

reverse()これは、実際に文字列を反転するときにコードが無効なメモリにアクセスしないように、null ポインターで呼び出された場合のセーフティ ネットとして使用されます。

于 2013-07-22T08:39:27.880 に答える
1

ステートメント

if (str)

と同等です

if (str != 0)

これは、コンパイラによって次のように解釈されます。

if (str != null-pointer-value-for-char-pointer-type)

つまり、「アドレス ゼロ」とはまったく関係ありません。コンパイラは、ポインター コンテキストを認識し、 type の実装依存の null ポインター値との比較を実行する必要がありますchar *。後者は、実装依存のアドレス値によって物理的に表され、必ずしもゼロのアドレスではありません。

于 2013-07-23T02:58:34.290 に答える
1

関数で NULL ポインターを渡す人をテストする必要があるかどうかを尋ねられた場合、答えは YES です。

于 2013-07-22T08:38:13.460 に答える
1

はい、アドレスがstr予約されている任意のアーキテクチャで NULL ポインタである可能性があります。0x000null pointer

于 2013-07-22T08:38:35.717 に答える
1

if(str)str にメモリが割り当てられているかどうかを確認するために追加されます。NULLベスト プラクティスは、宣言時にポインタを初期化することです。

上記は等しい

if(str != NULL)
{

} 
于 2013-07-22T08:38:51.337 に答える
1

ここで、strにはアドレスが含まれていますよね?

はい。ですchar *。その値は のアドレスを表しますchar

また、if(str) は、str が 0 の場合にのみ false と評価されますよね?

はい。

str にアドレス 0x0000 が含まれ、if(str) が false と評価される可能性はありませんか?

これは完全に可能です。この値で関数を呼び出すだけです。

char * myCharPointer = 0;
reverse(myCharPointer);

しかし、私はこのスタイルを使用することはありません。私は NULL を使用することを好みます。これは、C 標準で同等であることが保証されています。NULL の方が表現力があり、通常の整数値をアドレスから分離するのに役立つため、私は NULL を好みます。

char * myCharPointer = NULL;
reverse(myCharPointer);

次の関連する質問も参照してください。

于 2013-07-22T08:50:01.670 に答える