日記/2008-03-31/C C++のポインタの機能--参照渡しのような処理
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
] [
リンク元
]
開始行:
* [http://builder.japan.zdnet.com/sp/c-programming-langua...
[http://d.hatena.ne.jp/wakatono/ wakatonoの戯れメモ]より.
マトモそうなサイトの中では,おそらく史上最凶のポインタの...
どう最凶かは,次のサンプルプログラムを見れば一目瞭然.
#include <stdio.h>
int main( void ) {
int *n;
*n = 5; /* ポインタ変数nに値5を代入 */
printf( "%d\n", *n ); /* ポインタ変数nが持つ値(5)...
return 0;
}
初期化していないポインタの指し示すアドレスに 5 を書き込ん...
もちろんこんなものマトモに動くはずもなく,x86 Linux では ...
** gdb でのトレース [#p599fa2c]
こんなのをくどくど説明するのもアホらしいのだけど,gdb で...
(gdb) b main
Breakpoint 1 at 0x8048385: file hoge.c, line 6.
(gdb) c
The program is not being run.
(gdb) run
Starting program: /home/imai/a.out
Breakpoint 1, main () at hoge.c:6
6 *n = 5; /* ポインタ変数nに値5を代入 */
(gdb) print n
$1 = (int *) 0x4730b0b0
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x08048388 in main () at hoge.c:6
6 *n = 5; /* ポインタ変数nに値5を代入 */
(gdb) c
Continuing.
Program terminated with signal SIGSEGV, Segmentation fau...
The program no longer exists.
つまり,
int *n;
の時点では,n の値は不定なので,これを絵に描くと
+--------+
n |??? O----------> unknown memory
+--------+
となる.
*n = 5;
で
> unknown memory に 5 を書き込む
という操作を行うのだが,このアドレスは当該プロセスには割...
このため例外が発生し,めでたく Segmentation fault で異常...
** うまく動いてしまう場合 [#sde17130]
で,このプログラム,環境や運によってはうまく動いてしまう...
(gdb) b main
Breakpoint 1 at 0x8048385: file hoge.c, line 6.
(gdb) run
Starting program: /home/imai/a.out
Breakpoint 1, main () at hoge.c:6
6 *n = 5; /* ポインタ変数nに値5を代入 */
(gdb) print &n
$1 = (int **) 0xbfd54780
(gdb) set n=0xbfd50000
(gdb) c
Continuing.
5
Program exited normally.
(gdb) q
ここではデバッガ上で
(gdb) set n=0xbfd50000
で n の初期値を手動で設定して,「運がいい場合」をシミュレ...
このアドレスはスタック領域近辺であり,プロセスにはメモリ...
n の初期値がこんな値の場合はプログラムは無事実行され,正...
** どんな場合でも動作するようにするには [#a2068b44]
元記事のコメントや戯れメモのほうにも上がっているのだが,...
> きちんとメモリを割り当て,そのアドレスを n に設定
すればよいだけの話である.
そうすれば運や環境に左右されず,汎用的に正常動作するプロ...
** というわけでこの記事は [#q634964c]
この記事が公開されてしまったいきさつを最大限に良い方に解...
> 筆者も編集部もサンプルプログラムの動作確認をしたのだが...
というシナリオが考えられる.
が,イカレたサンプルプログラムを元に説明しているので,説...
> 続いて、*nを使って処理に用いる値を代入し、それを出力す...
「自動的に代入されるアドレス」って何だろう?
「int *n で int 型変数の格納領域が確保される」という意味...
「5 という整数型オブジェクトの格納アドレスが n に代入され...
意味不明である.
で,元記事コメントを見ている限りでは,編集部は
> 初心者に対する説明のために大雑把な表現となり,細かい正...
という認識のようであるが,実際のところ
> サンプルプログラム自体がイカレており,説明も意味不明
なわけで.
** 考えてみれば [#k190964d]
編集部内にこのような記事が書ける人がいれば,外部のライタ...
というわけでライタに記事を書いてもらったのだけど,それが...
で,そのライタが怪しい場合は…
そういう体制なんじゃないか,と,想像してみたりもする.
終了行:
* [http://builder.japan.zdnet.com/sp/c-programming-langua...
[http://d.hatena.ne.jp/wakatono/ wakatonoの戯れメモ]より.
マトモそうなサイトの中では,おそらく史上最凶のポインタの...
どう最凶かは,次のサンプルプログラムを見れば一目瞭然.
#include <stdio.h>
int main( void ) {
int *n;
*n = 5; /* ポインタ変数nに値5を代入 */
printf( "%d\n", *n ); /* ポインタ変数nが持つ値(5)...
return 0;
}
初期化していないポインタの指し示すアドレスに 5 を書き込ん...
もちろんこんなものマトモに動くはずもなく,x86 Linux では ...
** gdb でのトレース [#p599fa2c]
こんなのをくどくど説明するのもアホらしいのだけど,gdb で...
(gdb) b main
Breakpoint 1 at 0x8048385: file hoge.c, line 6.
(gdb) c
The program is not being run.
(gdb) run
Starting program: /home/imai/a.out
Breakpoint 1, main () at hoge.c:6
6 *n = 5; /* ポインタ変数nに値5を代入 */
(gdb) print n
$1 = (int *) 0x4730b0b0
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x08048388 in main () at hoge.c:6
6 *n = 5; /* ポインタ変数nに値5を代入 */
(gdb) c
Continuing.
Program terminated with signal SIGSEGV, Segmentation fau...
The program no longer exists.
つまり,
int *n;
の時点では,n の値は不定なので,これを絵に描くと
+--------+
n |??? O----------> unknown memory
+--------+
となる.
*n = 5;
で
> unknown memory に 5 を書き込む
という操作を行うのだが,このアドレスは当該プロセスには割...
このため例外が発生し,めでたく Segmentation fault で異常...
** うまく動いてしまう場合 [#sde17130]
で,このプログラム,環境や運によってはうまく動いてしまう...
(gdb) b main
Breakpoint 1 at 0x8048385: file hoge.c, line 6.
(gdb) run
Starting program: /home/imai/a.out
Breakpoint 1, main () at hoge.c:6
6 *n = 5; /* ポインタ変数nに値5を代入 */
(gdb) print &n
$1 = (int **) 0xbfd54780
(gdb) set n=0xbfd50000
(gdb) c
Continuing.
5
Program exited normally.
(gdb) q
ここではデバッガ上で
(gdb) set n=0xbfd50000
で n の初期値を手動で設定して,「運がいい場合」をシミュレ...
このアドレスはスタック領域近辺であり,プロセスにはメモリ...
n の初期値がこんな値の場合はプログラムは無事実行され,正...
** どんな場合でも動作するようにするには [#a2068b44]
元記事のコメントや戯れメモのほうにも上がっているのだが,...
> きちんとメモリを割り当て,そのアドレスを n に設定
すればよいだけの話である.
そうすれば運や環境に左右されず,汎用的に正常動作するプロ...
** というわけでこの記事は [#q634964c]
この記事が公開されてしまったいきさつを最大限に良い方に解...
> 筆者も編集部もサンプルプログラムの動作確認をしたのだが...
というシナリオが考えられる.
が,イカレたサンプルプログラムを元に説明しているので,説...
> 続いて、*nを使って処理に用いる値を代入し、それを出力す...
「自動的に代入されるアドレス」って何だろう?
「int *n で int 型変数の格納領域が確保される」という意味...
「5 という整数型オブジェクトの格納アドレスが n に代入され...
意味不明である.
で,元記事コメントを見ている限りでは,編集部は
> 初心者に対する説明のために大雑把な表現となり,細かい正...
という認識のようであるが,実際のところ
> サンプルプログラム自体がイカレており,説明も意味不明
なわけで.
** 考えてみれば [#k190964d]
編集部内にこのような記事が書ける人がいれば,外部のライタ...
というわけでライタに記事を書いてもらったのだけど,それが...
で,そのライタが怪しい場合は…
そういう体制なんじゃないか,と,想像してみたりもする.
ページ名:
-->