一、如何将一个结构体数据存放在void* data指针变量中
给data指针开辟足够大的空间,然后将填充数据后的memory结构体拷贝进去
(1)采用malloc/free
#include <iostream>
#include <unistd.h>
#include <string.h>
using std::cout;
using std::endl;
using std::string;
struct Memory
{
uint8_t x;
char ch[50];
uint8_t arr[1024];
};
struct Message
{
void* data;
};
int main()
{
//data开辟空间
Message msg;
msg.data = (Memory*)malloc(sizeof(Memory));
//填充数据
Memory mem;
mem.x = 6;
//mem.ch = "hello"; //写法错误
char s[] = "hello";
strcpy(mem.ch, s);
//或者如下写法
//string s = "hello";
//memcpy(mem.ch, s.c_str(), sizeof(s)); //注意是s.c_str()
//mem.arr = {1, 2, 3, 4, 5, 6}; 是错误的,不能对数组赋值
//uint8_t arr[1024] = {1, 2, 3, 4, 5, 6}; 是正确的,这叫数组初始化;
mem.arr[0] = 1;
//将填充完数据的结构体拷贝过去
memcpy(data, &mem, sizeof(mem));
//释放
if(nullptr != data)
{
free(data);
data = nullptr;
}
return 0;
}
二、new/delete
int main()
{
//data开辟空间
Message msg;
msg.data = new Memory();
//填充数据
Memory mem;
mem.x = 6;
char s[] = "hello";
strcpy(mem.ch, s);
//将填充完数据的结构体拷贝过去
memcpy(data, &mem, sizeof(mem));
//释放
if(nullptr != data)
{
//一定要强转类型
delete static_cast<Memory*>(data);
data = nullptr;
}
return 0;
}
如果不给指针开辟空间,则会出现Segmentation fault