技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

C言語を習い始めた頃に躓いたところ

最近、久々にC言語で書かれたプログラムのソース解析を行う機会があった。(普段はJavaperl がメイン。)

少し懐かしくなったので、主題の件についてちょっと書こうと思う。

 

  • static 修飾子の意味が使う場所によって変わる。

関数内で変数に対して使用すれば、関数が終わっても値を保持する変数となる。一方、関数外でグローバル変数に対して使用すれば、そのソースファイルからしか参照できない変数となる。

 

  • extern 修飾子は何者?

実体(定義)は他のソースファイルにあることを意味する。コンパイルの際は、1ファイルずつ処理されるので、他のソースファイルのグローバル変数を何も考えず参照すると、コンパイルエラーとなる。これに対して extern 修飾子を付けると、コンパイラは「他のソースファイルで定義されているから、ここは気にしない」としてエラーにならない。extern 変数はリンク時に解決される。

 

  • 関数内で変数定義する場合、普通に定義してスタック領域に確保すべきか、mallocしてヒープ領域に確保すべきか?

関数内で一時的に使用する変数の場合、スタック領域に確保する。関数が終わった後もしばらく使う場合は、ヒープ領域に確保する。なお、ヒープ領域に確保した場合、必要なくなった時に解放しないとメモリリークになるので要注意。

 

他にもいろいろ躓いたと思うのだが、もう十数年前なのでイマイチ思い出せない(苦笑) ちなみに、定番のはまりポイントと言われる「ポインタ」については、「実体へのメモリアドレスが入っている変数」くらいにシンプルに考えて、あまり躓かなかった。