どのような意図の問題なのでしょうか?
あなたの今のコードは以下のような状態になっています。
cpp
1#include <iostream>
2
3typedef unsigned char BYTE;
4
5// 問題で決まっている定数
6#define value 0x800000;
7
8void main()
9{
10 BYTE *hoge;
11 hoge = (BYTE *)value; // アドレス 0x800000を指すポインタ
12 std::cout << hoge << std::endl; // 0000000000800000
13
14 // 指定アドレスの値を初期化
15 *hoge = 1 << 0; // アドレス 0x800000 に変数が確保されているわけではないので、代入すると、メモリの不正アクセスになり、落ちる。
16}
追記
組み込みはわかりませんが、Windows や Linux の場合、メモリは OS が管理しており、プログラムは OS に割り当てられたプロセスメモリ空間を参照します。
物理アドレス空間と仮想アドレス空間の違いとその基礎知識
今回の問題点
問題点は文字列の文字の~というやつではなく、アドレスの値を初期化の部分なのか
今回の問題点は、値 1 << 0
つまり 1 をアドレス 0x800000 番地にセットしようとしたが、その領域に BYTE 型の変数領域が確保されていなかったためです。
他の回答者様がご指摘されているとおり、malloc() や new でメモリ領域を確保して、割り当てられたメモリを使うのが普通です。
BYTE* p = new BYTE;
*p = 1;
printf("p = %p\n", p); // 00000244554A30A0 割り当てられたメモリアドレス
printf("*p = %d\n", *p); // 1
任意のアドレスに確保することは不可能なのか
OS 依存の問題です。
Windows では、VirtualAlloc で指定したアドレスのメモリを確保できます。
cpp
1#include <iostream>
2#include <windows.h>
3
4typedef unsigned char BYTE;
5#define value 0x800000 // ; は不要
6
7void main()
8{
9 BYTE *ptr = (BYTE *)value; // アドレス 0x800000を指すポインタ
10 printf("ptr = %p\n", ptr); // ptr = 0000000000800000
11
12 // 0x800000 番地を予約する。予約に失敗した場合は NULL が返る。
13 ptr = (BYTE *)VirtualAlloc(
14 (LPVOID)ptr, sizeof(BYTE), MEM_RESERVE, PAGE_READWRITE);
15 if (ptr)
16 // 予約に成功した場合、確保する。
17 ptr = (BYTE *)VirtualAlloc(
18 (LPVOID)ptr, sizeof(BYTE), MEM_COMMIT, PAGE_READWRITE);
19
20 *ptr = 1 << 0; // 1b
21 printf("*ptr = %d\n", *ptr); // 1
22
23 *ptr = 1 << 1; // 10b
24 printf("*ptr = %d\n", *ptr); // 2
25}
その他
もし組み込みOSなど Linux/Windows 以外の特殊な環境の場合は、その事も質問欄に追記したほうがよいかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/08 16:14