C++
1int main() 2{ 3 uint8_t *Buff[100]; 4 uint32_t data = 100000; 5 6 memcpy(&Buff[0], &data, sizeof(data)); 7}
上記ような場合は、
memcpy実行後は、uint32のサイズ分であるBuff[0]~Buff[3]まで
変数dataの値が格納されているのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
C
1#include <stdio.h> // printf 2#include <string.h> // memcpy 3#include <stdint.h> // uint8_t, utin32_t 4 5int main(void) 6{ 7 uint8_t *Buff[100]; 8 uint32_t data = 100000; 9 10 memcpy(&Buff[0], &data, sizeof(data)); 11 printf("sizeof(Buff[0]) = %zd\n", sizeof(Buff[0])); 12 printf("data = %d (%#08x)\n", data, data); 13 for (int i = 0; i < 4; i++) 14 printf("Buff[%d] = %p\n", i, Buff[i]); 15}
64ビット版gcc による実行結果
sizeof(Buff[0]) = 8 data = 100000 (0x0186a0) Buff[0] = 0x186a0 Buff[1] = (nil) Buff[2] = 0x7fffd7a17fd0 Buff[3] = (nil)
ポインタが 8バイトなので 4バイトの値をコピーしても
下位4バイトに入るだけで、上位4バイトがゼロとは限りません。
Buff[0] = 0xXXXXXXXX000186a0 (X は不定) ととなる
可能性がありましたが、この例では偶然全部 0 でした。
Buff[1]、Buff[3]は 8バイト全部が 0 でした。
Buff[2] は何かゴミが入っています。
Buff 自体は自動変数なので初期化しないと何が入っているか分かりません。
私が不思議なのは、
質問者はどうして実行結果を自分で確かめようとしないのかということです。
確かめて、「自分はこういう結果になると思ったのに、違う結果が出てしまった。
なぜでしょうか?」と質問するべきなのです。
投稿2020/07/30 01:31
編集2020/07/30 01:52総合スコア8224
0
コードはuint32_t、本文はuint16。
100000代入しているからuint32_tなんでしょうね。(本文修正しましょう)
ならばsizeof(data)の値は4なので、sizeof(uint8_t *)が4ならBuff[0]のみにコピーされるでしょう。
そもそもポインタ配列Buffにdataをコピーする意味が不明。
投稿2020/07/29 23:08
総合スコア1095
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/30 22:14
0
同じとこから読んで同じとこにコピーしてるだけで、それは意味はありません
ちなみに、uint16_t の変数のサイズは2バイトです
投稿2020/07/29 07:55
編集2020/07/29 07:56総合スコア88042
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/29 07:58
2020/07/29 08:00
2020/07/29 08:01
2020/07/29 09:11
2020/07/29 09:11
2020/07/29 09:15
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/30 12:42
2020/07/30 14:45