配列とポインタの違いに関して
Posted: 2017年11月15日(水) 02:52
お世話になっております。
今回は配列とポインタの違いに関して疑問点があり、
質問させて頂きました。
私は配列とポインタは同じようなものだと認識していました。
例えば、以下のようなコードを考えます。
buff1とbuff2は要素の参照の仕方に違いはあれど、
基本的には同じものだと思っています。
例えば、char型のポインタを引数にとるfgets関数などにchar型の配列を指定しても動きます。
buff1は配列の先頭の要素の番地が、buff2はchar型の要素の最初の番地が格納されているという点でも、
同じだと思っていました。
今回疑問に思った点は、メモリの解放に関してです。
通常ポインタはfree関数でメモリを開放するかと思います。
しかし、C言語ではあまり配列のメモリを解放するということを聞きません。
これはなぜでしょうか?
C++に関してはdelete関数というものがありますが、C言語には無いように思います。
今回作成していたプログラムで、mallocの部分で実行時エラーが起きました。
少し調べた結果、一度mallocでメモリを確保して、free関数で解放し、
再度mallocで以前に使用したメモリ領域を跨ぐように確保しようとすると、実行時エラーが起きているような感じでした。
(この解釈が正しいかはわかりません)
そこで、一部をmallocではなく、配列に変更すると実行時エラーが発生しなくなりました。
なので、配列とポインタではメモリの処理に関して違いがあるのかなと思った次第です。
噂で聞いたのですが、mallocで格納したポインタは連続したメモリ領域が確保されるが、
配列は連続していない(ばらけている?)領域がとられると聞きましたが、今回の件に関係しているのでしょうか?
質問点をまとめますと、
・配列で確保したメモリ領域は明示的に解放しなくていいのか(C言語の場合)
・mallocでメモリを確保した場合と配列でメモリを確保した場合の、具体的な違いは何か?
ご教授頂ければ幸いです。
よろしくお願いいたします。
今回は配列とポインタの違いに関して疑問点があり、
質問させて頂きました。
私は配列とポインタは同じようなものだと認識していました。
例えば、以下のようなコードを考えます。
buff1とbuff2は要素の参照の仕方に違いはあれど、
基本的には同じものだと思っています。
例えば、char型のポインタを引数にとるfgets関数などにchar型の配列を指定しても動きます。
buff1は配列の先頭の要素の番地が、buff2はchar型の要素の最初の番地が格納されているという点でも、
同じだと思っていました。
今回疑問に思った点は、メモリの解放に関してです。
通常ポインタはfree関数でメモリを開放するかと思います。
しかし、C言語ではあまり配列のメモリを解放するということを聞きません。
これはなぜでしょうか?
C++に関してはdelete関数というものがありますが、C言語には無いように思います。
今回作成していたプログラムで、mallocの部分で実行時エラーが起きました。
少し調べた結果、一度mallocでメモリを確保して、free関数で解放し、
再度mallocで以前に使用したメモリ領域を跨ぐように確保しようとすると、実行時エラーが起きているような感じでした。
(この解釈が正しいかはわかりません)
そこで、一部をmallocではなく、配列に変更すると実行時エラーが発生しなくなりました。
なので、配列とポインタではメモリの処理に関して違いがあるのかなと思った次第です。
噂で聞いたのですが、mallocで格納したポインタは連続したメモリ領域が確保されるが、
配列は連続していない(ばらけている?)領域がとられると聞きましたが、今回の件に関係しているのでしょうか?
質問点をまとめますと、
・配列で確保したメモリ領域は明示的に解放しなくていいのか(C言語の場合)
・mallocでメモリを確保した場合と配列でメモリを確保した場合の、具体的な違いは何か?
ご教授頂ければ幸いです。
よろしくお願いいたします。