栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

使用memcpy

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用memcpy

使用memcpy_s一定要注意的问题!!!

1.结构体中有指针变量,当malloc结构体空间只给结构体指针变量分配空间4字节空间,就算在malloc中加上结构体指针要分配的空间大小也不行,结构体不会把分配的空间分给指针,导致后面memcpy_s返回22,目标地址为空
2.存放10个INT类型的指针,需要分配sizeof(INT) * PARANUM大小的空间,memcpy时数据的大小也为sizeof(INT) * PARANUM
源代码:

#include 
#include 
#include 

#define UINT unsigned int
#define INT int
#define VOID void
#define EOK 0
#define PARANUM 10

typedef enum {
    MOVE1 = 1,
    MOVE2,
    MOVE3,
    MOVE4,
    MOVE5,
    MOVE6,
    MOVE7,
    MOVE8,
    SELFMODE1 = 100,
    SELFMODE2,
    SELFMODE3,
} AUDIOMODE;

typedef enum{
    EQPARAFIXED,
    EQPARACUSTOM,
    EQPARAERR,
} EQTYPEFIXEDORCUSTOM;

typedef struct {
    UINT type;
    INT *gain;
    UINT lenGain;
} dataToAUDIO;

//global data
static AUDIOMODE g_userSettingEqParaType = SELFMODE1;
static UINT g_userSettingEqParaNum = PARANUM;
static INT g_userSettingEqPara[PARANUM] = {
    0x0a, 0x05, 0x0a, 0x0a, 0x05,
    0x05, 0x0f, 0x0f, 0x00, 0x00
};

EQTYPEFIXEDORCUSTOM UX_IntelligentGetEqSettingType(AUDIOMODE eqType)
{
    if (eqType >= MOVE1 && eqType <= MOVE8) {
        return EQPARAFIXED;
    } else if (eqType >= SELFMODE1 && eqType <= SELFMODE3) {
        return EQPARACUSTOM;
    }
    return EQPARAERR;
}

VOID UX_UserSetEqSettingSendToAudio(VOID)
{
    printf("UX_UserSetEqSettingSendToAudio msg!n");

    dataToAUDIO *para = (dataToAUDIO *)malloc(sizeof(dataToAUDIO *));
    if (para == NULL) { // malloc后数据要判空
        printf("UX_UserSetEqSettingSendToAudio malloc errn");
        return;
    }
    memset(para, 0, sizeof(dataToAUDIO)); // 记得初始化,虽然在编译后代码不会报错,但要养成良好的编码习惯

    para->type = g_userSettingEqParaType;
    if (UX_IntelligentGetEqSettingType(para->type) == EQPARACUSTOM) {
        printf("UX_UserSetEqSettingSendToAudio type:%dn", para->type);
        para->lenGain = g_userSettingEqParaNum;

        para->gain = malloc(sizeof(INT) * PARANUM);
        if (para->gain == NULL) { // malloc后数据要判空
            printf("UX_UserSetEqSettingSendToAudio para->gain malloc errn");
            free(para); // 退出函数记得释放para
            return;
        }
        memset(para->gain, 0, sizeof(INT) * PARANUM); // 记得初始化

        INT ret = memcpy_s(para->gain, sizeof(INT) * PARANUM, g_userSettingEqPara, sizeof(INT) * PARANUM); // 一定要注意目的地址和源地址的大小,否则读取不到数据
        if (ret != EOK) { // 记得判断返回值
            printf("UX_UserSetEqSettingSendToAudio memcpy_s err, ret=%dn", ret);
            free(para); // 退出函数记得释放para
            free(para->gain); // 退出函数记得释放para->gain
            return;
        }
        printf("UX_UserSetEqSettingSendToAudio para->type:%d para->lenGain:%d para:n", para->type, para->lenGain);
        for (UINT i = 0; i < para->lenGain; i++) {
            printf("%d ", para->gain[i]);
        }
        printf("n");

        free(para->gain); //释放para->gain
    }

    printf("UX_UserSetEqSettingSendToAudio success!n");
    free(para); //释放para
}

INT main()
{
    printf("main send data to audio!n");
    UX_UserSetEqSettingSendToAudio();
    printf("main send data to audio success!n");
    return 0;
}
编译输出:
main send data to audio!
UX_UserSetEqSettingSendToAudio msg!
UX_UserSetEqSettingSendToAudio type:100
UX_UserSetEqSettingSendToAudio para->type:100 para->lenGain:10 para:
10 5 10 10 5 5 15 15 0 0
UX_UserSetEqSettingSendToAudio success!
main send data to audio success!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692007.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号