user-0 提问: C语言memcpy问题

回复:
user: user-0
content: 引用 12 楼 u013399150 的回复:第一个memcpy就该出问题了吧， UINT8   pdata[1]; 这样写的意义不知道在哪里，你在malloc/free后，你给这个pdata塞三个uint，因为非法操作内存，会导致这块分配的内存释放不掉的  有意义的  pdata[1]只是为了这道一个变长字符串的首地址，拷贝的时候会赋值这个变长字符串的长度的，不然怎么定义一个变长字符串的结构体成员？

user: user-1
content: #include <stdio.h> #include <string.h> #include <openssl/aes.h> #include <stdlib.h>  #define UINT8    unsigned char #define UINT16    unsigned short #define m2mCharPtr_t    char *  typedef struct { 	UINT16  u16MesHeader; 	UINT16  u16MesSize; 	UINT8   u8SequCount; 	UINT8   u8Control; }MesHeader_t;  typedef struct { 	UINT8  u8ProVer; 	UINT8  u8EnctpErrco; }m2mDisHead_t;  typedef struct { 	UINT8   u8TarID; 	UINT8   u8SouID; 	UINT16  u16Appdatalen; 	UINT8   u8cmd; 	UINT8   pdata[1]; }m2mDisbody_t;  typedef struct { 	m2mDisHead_t    thead; 	m2mDisbody_t    tbody; }m2mdispmes_t;  int main() { 	MesHeader_t  gtMesHeader; 	m2mCharPtr_t pTarget;  	gtMesHeader.u16MesHeader = 0x7E5D; 	gtMesHeader.u16MesSize = 20; 	gtMesHeader.u8Control = 0; 	gtMesHeader.u8SequCount = 0;  	m2mdispmes_t gtMesDis;  	gtMesDis.thead.u8ProVer = 0; 	gtMesDis.thead.u8EnctpErrco = 1; 	gtMesDis.tbody.u8TarID = 0x36; 	gtMesDis.tbody.u8SouID = 0; 	gtMesDis.tbody.u16Appdatalen = 3; 	gtMesDis.tbody.u8cmd = 0; 	UINT8 sss[3] = { 0x03,0x01,0x15 };  	(void)memcpy(>MesDis.tbody.pdata, sss, 1); 	pTarget = new char[sizeof(MesHeader_t) + sizeof(m2mdispmes_t) - 1 + gtMesDis.tbody.u16Appdatalen + 1]; 	(void)memcpy(pTarget, >MesHeader, sizeof(MesHeader_t));  	(void)memcpy(pTarget + sizeof(MesHeader_t), >MesDis, sizeof(m2mdispmes_t) - 1 + gtMesDis.tbody.u16Appdatalen); 	delete pTarget; 	return 0; }

user: user-2
content: 这种结构体，最后一个参数是一个 ANYSIZE 的数组的，都是变长结构体。 不可以像普通结构那样实例化的，你必须在栈或堆上手动分配一个空间，这个空间需要加上变长数组的实际空间的。 然后就可以了。 实际上你copy pdata[1] 的时候就出错了，一个字节大小的数组，你复制了 3  个字节。

user: user-3
content: 第一个memcpy就该出问题了吧， UINT8   pdata[1]; 这样写的意义不知道在哪里，你在malloc/free后，你给这个pdata塞三个uint，因为非法操作内存，会导致这块分配的内存释放不掉的

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //  linux编译无法通过

user: user-0
content: 引用 6 楼 N_sev7 的回复:先malloc申请内存，然后再memcpy 注意结构体的自动补齐问题，解析的时候可能会用到 sizeof的大小可能跟数据报不相同吗？   目前好像没遇到

user: user-0
content: 引用 3 楼 faihung 的回复:除了楼上两位说的，你的memcpy函数里面的参数是不是有问题 请问有啥问题

user: user-4
content: 先malloc申请内存，然后再memcpy 注意结构体的自动补齐问题，解析的时候可能会用到

user: user-5
content: 先用malloc分配内存，然后用memcpy拷贝数据。

user: user-6
content: void *memcpy(void*dest, const void *src, size_t n);返回值是不是个指针

user: user-7
content: 除了楼上两位说的，你的memcpy函数里面的参数是不是有问题

user: user-8
content: 仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

user: user-7
content: 引用 7 楼 tb01024632 的回复:[quote=引用 3 楼 faihung 的回复:] 除了楼上两位说的，你的memcpy函数里面的参数是不是有问题 请问有啥问题[/quote]抱歉没有问题，我上午用的手机看的，手机显示不全。

user: user-9
content: 你这个第一次向pTarget中拷贝了sizeof(MesHeader_t)大小的数据，第二次又紧接着拷贝了sizeof(m2mdispmes_t)-1+gtMesDis.tbody.u16Appdatalen大小的数据，两个加起来就是pTarget所需要的最小空间了

user: user-10
content: 第一个问题：memcpy调用时去掉前面的(void)，调用不是定义，因此没必要加(void)； 第二个问题：pTarget是野指针，解决办法是使用malloc申请空间，根据需要申请大小，主要需要知道pTarget需要指向存储什么数据和多大的数据。：