memcpyで踏んだ穴を使って、注意に値します

3495 ワード

背景の説明:
最近1つのqtプロジェクトの中で、データの伝送部分は何度もmemcpyを使って、プログラムのコンパイルは1つの警告あるいは間違いを報告していませんが、実行すると不安定になって、时には実行することができなくて、时には走って何本のデータを伝送することができて、时には数十本のデータを受信することができて、しかし最終的にプログラムはすべて異常crashed!!ひどく腹を立てている.问题を排除して半日探して、野の指针、配列は境界を越えて、メモリの漏洩はすべて真剣に何度も検査して、本当に问题がどこにあるかを探し当てていないで、最后に最も愚かな方法を采用して、コードのモジュールを分けて注釈して、次第に问题の范囲をロックして、最后にやっとデータのコピーのこの1枚が问题があることを発见して、それからまた再びmemcpyを学んで、やっと问题気をつけないと間違えるところ、本当に難しい!!!
以下のmemcpy()memcpyは、CとC++で使用されるメモリコピー関数を指し、関数のプロトタイプは次のとおりです.
void *memcpy(void *destin, void *source, unsigned n)

関数の機能は、ソースメモリアドレスの開始位置から複数のバイトをターゲットメモリアドレスにコピーすること、すなわちソースソースソースからnバイトをターゲットdestinにコピーすることである.
問題が来て、私がマークしたところに注意して、コピーしたのはバイト数で、個数ではありません!この言葉はどういう意味ですか.次はコードで説明します.
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    memcpy(a, a + 3, 2);

この結果はそうだと思いますか.3,4,2,3,4,5,6,7,8,9
それは私と同じ間違いを犯したので、長い間探しても間違いがどこにあるか分からない.もう一度強調しますが、コピーしたのはバイト数で、個数ではありません!では、正しい結果を分析するには何が必要ですか.
問題解決
1つのintタイプが4バイトを占め、上のコピーが2バイトしかコピーされていないのに、あなたが望む結果を得ることはできませんか?正しい書き方は次のようになります.
memcpy(a, a + 3, 2*sizeof(int));

3,4,2,3,4,5,6,7,8,9が理想の答えです!
参照先:https://blog.csdn.net/baidu_35679960/article/details/80953973