2016-05-24 13 views
-1

対ポインタの配列Cコードのこれら2つが同じ目標達成ください:C:へのポインタのポインタ

p[1] = "Foo"; 
*(p+2) = "Bar"; 

--------------------- 

z[1] = "Foo"; 
*(z+2) = "Bar"; 

です:彼らは同じように使用することができますように思え

char ** p; 
p = malloc(sizeof(char*) * 10); 

-------------------------------- 

char * z[10]; 

をそこに違いはありますか?

+2

を使用することなく、個々の文字参照を解除あなたはどう思いますかすることができないということでしょうか?あなた自身を見つけるために何をしましたか? **特に**あなたは理解できませんか? – Olaf

+0

私は両方のフォームで遊んだことがあり、違いを見つけることはできません。私が見逃したことがあるかどうか疑問に思っていただけです。 –

+0

はい、あなたはC本の中のいくつかの章を見逃していました。 '' sizeof(p)== sizeof(z) 'を試してください – Olaf

答えて

2

配列またはmallocで割り当てられた領域から値を格納および取得するだけで、同じ動作をします。

ただし、違いはあります。 sizeof&の動作が異なる場合は、メモリを解放するためにmallocによって割り当てられた領域を明示的にfreeにする必要があります。そのサイズはreallocで変更できます。

+0

あ、いいね。ありがとう。したがって、配列に似た構造を動的にサイズ変更する必要がある場合は、ポインタからポインタへのポインタを使用しますか? –

+0

@vjb:あなたの配列(または "配列")が動的に縮小したり拡大したりする必要がある場合は、それを割り当てるために 'malloc'を使います。 –

-1

Cメモリは、いくつかのタイプにスタック -for関数呼び出しとローカル変数を分割し、その後mallocで割り当てられたオブジェクト-for ヒープがあるれています。スタックは通常、ヒープよりも小さいサイズです。その結果、巨大な配列をスタックに配置しようとすると、スタックの記憶領域を超えてsegfaultが発生する可能性があります。

この場合、配列をmallocすると、ヒープメモリが使用されています。空き領域が明示的に割り当て解除されるまで存在します。これは、大きな配列サイズを使用している場合に便利です。 最初のケースでは、スタック内の配列を宣言していますが、配列はスタックを呼び出す関数が存在する限り存続します。

ここではアレイのサイズが小さいため、両方とも動作します。しかし、より大きな配列の場合は、segfaultを避けるためにmallocが推奨されます。

0

の使用と機能に関して、実際に使用する方法を除いて違いはありません。

私が言っていることの一例は、multidim配列全体の反復と逆参照にダブルポインタを使うことができるということです。

あなたがmallocの場合は、完了したらfreeと一致する必要があります。

実際に必要と思われるときや膨大な量のメモリが必要なときは、もちろんmallocにしてください。

私が言いたい

最後の部分は、ポインタの配列で、あなたは添字演算子[]

関連する問題