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!



