低レベルプログラミングの書籍の中で、const int型の変数xの中身を書きかえるコードをMac環境で再現できずに。やろうとしている内容は、次の通りです。
変数をconstで修飾しても、絶対安全ではない。それでも変更する方法はあるのだ。const int xという変数について、それを示そう(リスト9-21)。
- それを指すポインタを作る。その型は、const int*となる。
- このポインタを、int*にキャストする。
- 新しいポインタをデリファレンスする。これで新しい値をxに代入できる。
(低レベルプログラミングより抜粋)
リスト9-21のソースコードはこちらのリポジトリにあります。const_cast.c
これをMacの環境で試したところ、変更されるはずの変数xが変更されませんでした。何が原因なのかを調べるために、上記のコードをステップごろに分解したコードを作成しました。
main.c
c
1#include <stdio.h> 2 3int main() { 4 const int x = 10; // ここは同じ 5 const int *px = &x; // xのポインタを作る 6 int *py = (int *)px; // const int*型をint*型にキャストする 7 *py = 30; // 新しいポインタをデリファレンスする。 8 9 printf(" x=%d, &x=%p\n", x, &x); 10 printf("*px=%d, px=%p\n", *px, px); 11 printf("*py=%d, py=%p\n", *py, py); 12 13 return 0; 14}
これをMacのtermianlでコンパイル(gcc main.c
)して実行したところ、同じアドレスを示しているにもかかわらず、xの数値のみが変更前の10という値を返しました。
x=10, &x=0x7ffee6feaa38 *px=30, px=0x7ffee6feaa38 *py=30, py=0x7ffee6feaa38
上記のコードをDebian上でコンパイル/実行を行ったところ、書籍の内容の通りconst int型の中身が変更されました。
x=30, &x=0x7ffde77e3d3c *px=30, px=0x7ffde77e3d3c *py=30, py=0x7ffde77e3d3c
この振る舞いの違いは何に起因するのかよく分からずにおります。gccのバージョンやOSの違いで説明がつくものなのでしょうか・・・何かご存知の方がいらっしゃいましたらお教え願えますと幸いです。
OSとgccのバージョンは下記の通りでした。
Mac OSX 10.13.4
$ gcc --version Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 9.1.0 (clang-902.0.39.1) Target: x86_64-apple-darwin17.5.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Debian 9.4
# gcc --version gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516 Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
長くなりましたが、最後まで目を通していただきありがとうございました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/19 16:23