今日の一言
2010/09/08(Wed) 肉が食いたい [長年日記] 0:00現在曇 28℃
_ [Debian][Ubuntu][FC][Linux][Choromet][研究関係][雑記]1つのNICに複数のIPアドレスを割り当てる(HRP2-m Chorometを使う おまけその2)
例えば、デフォルト設定のchorometの場合、ホストPC側のIPアドレスを「192.168.201.222」にする必要がある。
もちろん、ホストPCに合わせてchorometの方の設定ファイルを変更してもいいが、DHCP等で自動割り当てされており、固定IPでない場合には、これは使えない。
そういった場合には、DHCPにより割り当てられるIP以外に、chorometと接続する用のIPアドレス「192.168.201.222」を割り当てておく方が便利だ。
1つのNICに複数アドレスを割り当てるには、ifconfigコマンドの持つ、IPエイリアスという機能を利用する(http://www.itmedia.co.jp/help/tips/linux/l0494.html)。
# ifconfig eth0:0 192.168.1.12
この場合、メインとなるインターフェイス名「eth0」の次に「:」とエイリアス番号(通常は0から始まるエイリアスの連番)を指定している。
これで、
# ifconfig
を打つと、通常の「eth0」に加え、「eth0:0」という仮想的なインタフェースが現れるようになる。
意外と便利なのでぜひお試しあれー。
以上!
_ [C++][雑記]配列を引数にとる関数についてのメモ(sizeofの結果が4バイトになってしまう話)
具体的には、以下のようなプログラムを書いた場合に、引数とした配列のサイズを関数内で得ようとしたときに、sizeofの結果が4となる理由についてのメモ。
*これが原因でセグメンテーションフォルトを起こしていたので、反省の意味も込めて書いておく。
*より詳しく知りたい人は、こちら(http://www.cc.kyoto-su.ac.jp/~yamada/ap/array.html#argument)とか、こちら(http://www.jpcert.or.jp/sc-rules/c-arr01-c.html)を見た方がいいかも。
#include <stdio.h> int test_sizeof( char* str) { int n; n = sizeof(str); printf("func: size=%d %s\n",n,str); return 0; } int main() { int n; char str[] = "――――I am the bone of my sword."; n = sizeof(str); printf("main: size=%d %s\n",n,str); test_sizeof(str); return 0; }
結果:
main: size=39 ――――I am the bone of my sword. func: size=4 ――――I am the bone of my sword.
printfでは、同じ39文字の文字列が表示されるにも関わらず、関数内でのsizeof()の結果は4。
で、なぜ、こういう結果が出るのかであるが、端的に言うと、配列を引数にとった場合、実際にはポインタが渡される為である。
上のプログラムを見れば分かるが、文字列「str」はポインタ変数として渡されている。
その為、関数内で「str」のサイズを得ようとしてsizeof(str)としても、得られるのは、ポインタ変数1個分のサイズ(4バイト)である。
とまあ、非常に単純な話なのだが、ここで問題を分かりにくくしているのが、
int test_sizeof( char* str)
ではなく、
int test_sizeof( char[] str)
と書いてもコンパイル出来る点である。実際にはポインタなのに、あたかも配列のように扱えるため、こんな間違いを犯してしまう。
結局何が言いたいかというと、これを考えずに、sizeofの結果を使ってmallocでメモリを確保すると、後で原因が分からなくなって大変困る、ということだ。
以上!