回答編集履歴
1
質問のコードの問題点の指摘を追記
test
CHANGED
@@ -129,3 +129,65 @@
|
|
129
129
|
}
|
130
130
|
|
131
131
|
```
|
132
|
+
|
133
|
+
---
|
134
|
+
|
135
|
+
**追記**
|
136
|
+
|
137
|
+
質問のコード
|
138
|
+
|
139
|
+
```C
|
140
|
+
|
141
|
+
// void型のdstをuint32_t型にキャストする
|
142
|
+
|
143
|
+
No.number1 = ( uintptr_t )&dst;
|
144
|
+
|
145
|
+
```
|
146
|
+
|
147
|
+
コメントが間違っています。
|
148
|
+
|
149
|
+
dst の型は、void型ではなく、void *、すなわち「voidへのポインタ」型です。
|
150
|
+
|
151
|
+
&dst は引数 dst のアドレスです。
|
152
|
+
|
153
|
+
&dst の型は void * *、すなわち「voidへのポインタへのポインタ」型です。
|
154
|
+
|
155
|
+
(uintptr_t) により void * * を unsigned int * にキャストしています。
|
156
|
+
|
157
|
+
No.number1 の型は uint32_t、すなわち unsigned int です。
|
158
|
+
|
159
|
+
ポインタが 4バイトのコンパイラでは、No.number1 にはそのポインタの値が入るでしょう。
|
160
|
+
|
161
|
+
ポインタが 8バイトのコンパイラでは、No.number1 にはそのポインタの値の下位32ビットが入るでしょう。
|
162
|
+
|
163
|
+
union の意味をご存知でしょうか?
|
164
|
+
|
165
|
+
No は 4バイトしかありません。
|
166
|
+
|
167
|
+
そこには、No.number2[0]~No.number2[3] に代入した値が入っています。
|
168
|
+
|
169
|
+
No.number1 への代入は、.number2 に代入した値を破壊します。
|
170
|
+
|
171
|
+
引数 dst のアドレスが No.number1 には代入されたからです。
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
質問のコード
|
176
|
+
|
177
|
+
```C
|
178
|
+
|
179
|
+
// number1の4バイト分のメモリをdstにコピーする
|
180
|
+
|
181
|
+
memcpy( dst, No.number1, 4);
|
182
|
+
|
183
|
+
```
|
184
|
+
|
185
|
+
memcpy の第2引数には、コピー元のアドレスを渡さなければなりません。
|
186
|
+
|
187
|
+
したがって、memcpy( dst, &No.number1, 4); としないといけません。
|
188
|
+
|
189
|
+
No.number1 = ( uintptr_t )&dst; を削除すれば、
|
190
|
+
|
191
|
+
No.number1 には .number2 に代入された値が既に入っているので、
|
192
|
+
|
193
|
+
memcpy によって目的が達成できます。
|