回答編集履歴

1

a

2018/10/08 17:04

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- typedef unsigned int BYTE;
15
+ typedef unsigned char BYTE;
16
16
 
17
17
 
18
18
 
@@ -41,3 +41,123 @@
41
41
  }
42
42
 
43
43
  ```
44
+
45
+
46
+
47
+ ## 追記
48
+
49
+
50
+
51
+ 組み込みはわかりませんが、Windows や Linux の場合、メモリは OS が管理しており、プログラムは OS に割り当てられたプロセスメモリ空間を参照します。
52
+
53
+
54
+
55
+ [物理アドレス空間と仮想アドレス空間の違いとその基礎知識](http://128bit.blog41.fc2.com/blog-entry-32.html)
56
+
57
+
58
+
59
+ ### 今回の問題点
60
+
61
+
62
+
63
+ ```
64
+
65
+ 問題点は文字列の文字の~というやつではなく、アドレスの値を初期化の部分なのか
66
+
67
+ ```
68
+
69
+
70
+
71
+ 今回の問題点は、値 `1 << 0` つまり 1 をアドレス 0x800000 番地にセットしようとしたが、その領域に BYTE 型の変数領域が確保されていなかったためです。
72
+
73
+
74
+
75
+ 他の回答者様がご指摘されているとおり、malloc() や new でメモリ領域を確保して、割り当てられたメモリを使うのが普通です。
76
+
77
+
78
+
79
+ ```
80
+
81
+ BYTE* p = new BYTE;
82
+
83
+ *p = 1;
84
+
85
+ printf("p = %p\n", p); // 00000244554A30A0 割り当てられたメモリアドレス
86
+
87
+ printf("*p = %d\n", *p); // 1
88
+
89
+ ```
90
+
91
+
92
+
93
+ ### 任意のアドレスに確保することは不可能なのか
94
+
95
+
96
+
97
+ OS 依存の問題です。
98
+
99
+ Windows では、[VirtualAlloc](https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa366887(v=vs.85).aspx) で指定したアドレスのメモリを確保できます。
100
+
101
+
102
+
103
+ ```cpp
104
+
105
+ #include <iostream>
106
+
107
+ #include <windows.h>
108
+
109
+
110
+
111
+ typedef unsigned char BYTE;
112
+
113
+ #define value 0x800000 // ; は不要
114
+
115
+
116
+
117
+ void main()
118
+
119
+ {
120
+
121
+ BYTE *ptr = (BYTE *)value; // アドレス 0x800000を指すポインタ
122
+
123
+ printf("ptr = %p\n", ptr); // ptr = 0000000000800000
124
+
125
+
126
+
127
+ // 0x800000 番地を予約する。予約に失敗した場合は NULL が返る。
128
+
129
+ ptr = (BYTE *)VirtualAlloc(
130
+
131
+ (LPVOID)ptr, sizeof(BYTE), MEM_RESERVE, PAGE_READWRITE);
132
+
133
+ if (ptr)
134
+
135
+ // 予約に成功した場合、確保する。
136
+
137
+ ptr = (BYTE *)VirtualAlloc(
138
+
139
+ (LPVOID)ptr, sizeof(BYTE), MEM_COMMIT, PAGE_READWRITE);
140
+
141
+
142
+
143
+ *ptr = 1 << 0; // 1b
144
+
145
+ printf("*ptr = %d\n", *ptr); // 1
146
+
147
+
148
+
149
+ *ptr = 1 << 1; // 10b
150
+
151
+ printf("*ptr = %d\n", *ptr); // 2
152
+
153
+ }
154
+
155
+ ```
156
+
157
+
158
+
159
+ ### その他
160
+
161
+
162
+
163
+ もし組み込みOSなど Linux/Windows 以外の特殊な環境の場合は、その事も質問欄に追記したほうがよいかと思います。