C言語の2次元配列とJavaの“配列の配列”の違いに注意JavaTips 〜Javaプログラミング編

» 2006年09月13日 10時00分 公開
[平野正喜@IT]

 Java以外の言語で書かれたプログラムをJavaに移植するとき、注意すべきことの1つが、多次元配列の取り扱いです。例えば、下記のC言語のプログラムがあるとします。

2次元配列を操作するCプログラム 2次元配列を操作するCプログラム
上記の実行結果 上記の実行結果

 実行結果を見てのとおり、C言語では、2次元配列の領域確保と初期化を同時に行うことができ、このとき、初期値が指定されていない要素には自動的に初期値(この例では、int型なので0)が設定されます。

 このプログラムをJavaに移植してみましょう。Javaにおいても、2次元配列の領域確保と初期化を同時に行うことができますが、配列の大きさを指定するとエラーになりますので、要素数のカウントはJavaに任せます。

 しかし、実行すると例外が発生してしまいます。

Javaへの移植(失敗例) Javaへの移植(失敗例)

 この違いは、CとJavaの2次元配列に対する実装方法の差によって起こります。C言語などでは、2次元配列とは要素数×要素数で表せる配列ですが、Javaでは参照構造を用いた「配列の配列」になっています。つまり、Javaでは、配列というオブジェクトへの参照を配列にしたものということになり、厳密には2次元配列ではないのです。ですから、配列を行列として見た場合に、各行の長さ(要素数)が違っても構いませんが、最初の行の長さを全部の行の長さとして用いると、この例のように例外が発生してしまうわけです。

 このプログラムの場合、省略時の初期値である「0」を明示的に与えるか、下記のように、大きさを指定した領域確保をしてすべての要素に初期値を与えてから用いるといいでしょう。

Javaへの移植(改良例) Javaへの移植(改良例)

Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。