回答編集履歴

1

質問のコードの問題点の指摘を追記

2019/11/21 14:04

投稿

kazuma-s
kazuma-s

スコア8224

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 によって目的が達成できます。