以前から、こんなことってできるのかな?
と思っていたことがあります。
例えば、「とある変数のアドレスが分かっていた」という前提で進めます。
ex: とある変数i = 0xffff436e だったとします。
ASLRは無効の状態で考えてください。
int main(){
char *g = "\x6e\x43\xff\xff";
printf("%d", *g);
return 0;
}
とすると、、、110という結果が出てきました。
この110という数字はとある変数iの値であると”必ず”言えますか?
gの変数はダブルクォーテーションでくくっているので、文字列であると思います。
そうすると....
「"\x6e\x43\xff\xff"の文字列の先頭のアドレスに格納されている値を%dで出力しているだけ」という結論になりそうです。
自分的にはiの値ではないような気がしています。
どなたか教えてください。
一応はしてみたのですが・・・・『??』状態になってます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
現代的なOS上でのプログラミングで出てくる場面はほぼないですが、ハードウェア寄りの開発では、「特定のメモリアドレスを読む/書く」ことが必要となる場面もあります。
C
1//PC-98のVRAMを直接叩く例 2 3#define PLANE1 ((unsigned char *)0xa8000000L) 4#define PLANE2 ((unsigned char *)0xb0000000L) 5#define PLANE3 ((unsigned char *)0xb8000000L) 6 7// あとからPLANE1[100] = 8; のように書き込む
投稿2016/11/30 22:56
総合スコア146657
0
###一つのメモリ領域を複数の型として処理する共用体の紹介
C言語の言語仕様内でまっとうに(?)解決する方法として共用体(union)があります。
C
1#include <stdio.h> 2union uniondata { 3 char g[5]; 4 unsigned int i; 5}; 6 7int main(){ 8 union uniondata udata; 9 10 strcpy(udata.g, "\x6e\x43\xff\xff"); 11 12 printf("g = %s\n", udata.g); 13 printf("i = %08x\n", udata.i); 14 15 return 0; 16}
union使ったコードなんて20年以上ぶりに書いたんで合ってるかちょっと心配 :-(
投稿2016/11/30 15:01
総合スコア7918
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
えーと、まず、次のコードですが、
char *g = "\x6e\x43\xff\xff";
ですが、文字型のアドレスを格納する変数 g に、
文字列次のデータが格納されたメモリの先頭アドレスを代入しています。
addr : +0 +1 +2 +3 +4
xxxx : 6E 43 FF FF 00
ここで、アドレスを xxxx と書いたのは、この場合、文字列のアドレスは、
リンク時に決定されるアドレスだからです。
で、
printf("%d", *g);
は、先頭にある 6e (16進数)というデータを数字(10進数)で表示しなさいと
いう事になるので、結果として、110 という値が表示されます。
しかし、質問に、 ex: とある変数i = 0xffff436e だったとします。
とありますので、やりたい事とコードが違っている様に思えます。
多分やりたい事は、
char *g = (char *)0xFFFF436E;
を行った場合という事ではないでしょうか?
組み込みの環境などで、物理メモリの 0xFFFF436E を直接アクセス
する必要がある場合には、実際にこのような書き方をする場合もあります。
一般的な、WindowsやLinuxのアプリケーションでは、このような事をやっても、
おそらくアクセス違反となるでしょう。
投稿2016/11/30 12:51
総合スコア241
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
もしかして、やりたかったのはこういうこと?
C
1#include <stdio.h> 2int main(){ 3 char *g = "\x6e\x43\xff\xff"; 4 printf("%08x\n", *(unsigned int *)g); //==> ffff436e 5 return 0; 6}
投稿2016/11/30 12:41
編集2016/11/30 12:47総合スコア257
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/30 15:37
2016/12/01 04:06
2016/12/01 07:13
2016/12/01 08:28
2016/12/01 14:02
2016/12/01 14:25

0
g
は、charへのポインタなので、*g
はcharです。g
は文字列の先頭アドレスが入っているので、*g
はその先頭文字、つまり'\x6e'
です。
つまり、
C
1printf("%d", '\x6e');
とおなじで、100が表示されます。
とあるchar変数のアドレスが0xffff436eだったとして、その変数の値を表示したいのなら、
C
1char *g = 0xffff436e; 2printf("%d", *g);
です。
投稿2016/11/30 12:38
総合スコア86349
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
回答ではありません。すみません。
「"\x6e\x43\xff\xff"の文字列の先頭のアドレスに格納されている値
って具体的に何を指しているのでしょうか?
ex: とある変数i = 0xffff436e だったとします。
この仮定が及ばない(変数iがない)と思われる以下の環境でも110と出力されるようですが、どう思われますか?
hogehuga
投稿2016/11/30 12:28
編集2016/11/30 12:30総合スコア38352
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/01 00:18
2016/12/01 07:01