2017-02-19 5 views
-2

C言語の関数は配列を入力として受け取り、someonesは配列のNULLを渡します。関数がarray [0]または任意の数値を返した場合、何が返されますか? 0?ヌル?配列[0]で数学や他のことをしようとすると同じですか?最も重要なのは、NULL配列が渡された場合、どうすれば関数チェックを行うことができるのでしょうか?CのNULL配列には実際に何が入っていますか?

+2

。ポインタの値をチェックするには、 'if'文を使います。 –

+0

@KerrekSBああ、意味があります。私はまだポインタに慣れています。ポインタが "NULL"に等しいかどうかを確認することはできません。したがって、ゼロに等しいかどうかをチェックすれば同じことになりますか? – Clotex

+0

あなたのテキストブックを読んでください。あなたは間違いなく 'NULL 'とポインタを比較できるはずですが、おそらく' #include 'を忘れてしまいました。 –

答えて

1

この場合、array[0]にアクセスするとNULLポインタが逆参照されます。これは未定義の動作です(ほとんどの場合、プログラムがクラッシュする)。

あなたはNULLポインタを渡されてきた場合は、単にNULLとarrayを比較することで確認できます。

if(array == NULL) { 
    return 0; 
} else { 
    return array[0]; 
} 
+0

この実装が意味を成すAPIは完全な設計災害であると指摘する価値はあります。 –

+0

@KerrekSBは同意しない。例えばヌルポインタが0で埋められた配列と同じように動作するように定義することができます –

+0

@ M.M:あなたは私の主張をしていると思います。 :-) –

0

あなたは、メモリ位置0から行われますarray[0]の読み出し、NULL (0)ようにポインタを渡す場合。あなたのケースでは

data = *(type_of_pointer *)(array + key * sizeof(type_of_pointer)); 

data = *(type_of_pointer *)(0 + 0 * sizeof(type_of_pointer)); 

だからあなたの読書は、メモリ位置0から行われることになる配列[0]と0[array]同じものであるので、あなたはこのようなメモリ位置と考えることができます。ほとんどの場合、プログラムがクラッシュしますが、一般的には未知の動作です。

array[5]を読むと、これを行うだろう:あなたが唯一のポインタを渡すことができますC.に関数のパラメータとして配列を渡すことはできません

data = *(type_of_pointer *)(array + 5 * sizeof(type_of_pointer)); 
+0

その場合、 'array [0]'の読み込みは未定義の動作です。ほとんどのシステムでは、メモリ位置0を読み込もうとしません。 –

+0

真実ですが、私は一般的な答えを出しました。 – tilz0R

関連する問題