我有一个结构:
struct data{
int num1;
int num2;
int num3;
int num4;
}
现在,我可以转换单个元素并将它们放入缓冲区中,但我想将整个结构体复制到一个缓冲区中(char buffer[sizeof(data)])。
有没有一种方法可以复制整个结构体?
我有一个结构:
struct data{
int num1;
int num2;
int num3;
int num4;
}
现在,我可以转换单个元素并将它们放入缓冲区中,但我想将整个结构体复制到一个缓冲区中(char buffer[sizeof(data)])。
有没有一种方法可以复制整个结构体?
memcpy 可以完成这个操作
微软系统可以使用memcpy_s 对大小进行自动检查
你还需要注意 struct data
内部的指针。
struct data {
int num1;
char* name;
}
char* name
指针所指向的内存内容将不会被memcpy
函数复制。您需要一些更加复杂的序列化方式。
以下是一些有效的代码示例。它可以将数据复制到另一个位置,然后显示结果:
struct data{
int num1;
int num2;
int num3;
};
int main(int argc, char** argv)
{
data my_data;
my_data.num1 = 64;
my_data.num2 = 65;
my_data.num3 = 66;
char buffer[20];
memcpy(buffer, &my_data, sizeof(data));
data copy_data;
memcpy(©_data, buffer, sizeof(data));
printf("the numbers : %d - %d - %d \n", copy_data.num1, copy_data.num2, copy_data.mum3);
return 0;
}
memcpy(buffer, var_data, sizeof(buffer))
可能是一个更好的选择。 - Bendata
是结构体的名称,而不是变量的名称,因此您不需要使用 &data
。 - Benstruct data data = {...}
,则memcpy(buffer &data, sizeof(data))
肯定有效。无论如何,给出的答案是错误的,需要进行编辑。 - Jim Baltermemcpy(buffer, data, sizeof(data))
,这个语句只有在data是char[]类型时才正确,但在这里它不是。 - Jim Balterchar *
参数的API将结构体中的数据写入Flash。memcpy
可以实现您想要的功能。但它们都涉及在RAM中为该缓冲区分配内存。使用这些方法将起作用,但会浪费时间和内存。假设您的Flash API有以下函数:int WriteBlock(int address, char *data, int length);
data_var
的变量中,您可以像使用memcpy一样使用API:int success = WriteBlock(my_address, (char *) &data_var, sizeof(struct data)
union {
struct data{
int num1;
int num2;
int num3;
int num4;
};
char data_arr[sizeof(struct data)];
};
struct data{
int num1;
char num2;
long num3;
short num4;
}
/* 8位 */ 0x1234 5678 9ABC DEF0 1234 5678 9ABC DE00 /* 16位 */ 0x1234 5678 009A BCDE F012 3456 789A BCDE /* 32位 */ 0x1234 5678 0000 0000 0000 009A BCDE F012 3456 789A 0000 0000 0000 BCDE在这种情况下,你必须使用更丑陋的东西,比如下面的函数:
int fillDataBuffer(struct data d, char *buffer, int len)
{
int i, j = 0;
for (i = sizeof(d.num1) - 1; i >= 0 && j < len; i--, j++) {
buffer[j] = (char) (d.num1 >> i);
}
for (i = sizeof(d.num2) - 1; i >= 0 && j < len; i--, j++) {
buffer[j] = (char) (d.num2 >> i);
}
for (i = sizeof(d.num3) - 1; i >= 0 && j < len; i--, j++) {
buffer[j] = (char) (d.num3 >> i);
}
for (i = sizeof(d.num4) - 1; i >= 0 && j < len; i--, j++) {
buffer[j] = (char) (d.num4 >> i);
}
if (j >= len) {
/* Error! The buffer wasn't big enough. */
return 0;
} else {
return 1;
}
}
typedef struct{
int num1;
int num2;
int num3;
int num4;
} Data;
Data foo = { 1, 2, 3, 4};
char buffer[sizeof foo]; // at least
memcpy(buffer, &foo, sizeof foo);
然而,我会质疑你为什么要将一个结构体复制到一个字符缓冲区中。你应该说明你实际想要实现什么,因为很有可能有更好的方法来解决问题。
使用memcpy函数可以将整个结构体复制到缓冲区中。 例如,在以下代码中,'ob1'的内容被复制到'buffer'中:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data{
int num1;
int num2;
int num3;
int num4;
};
int main()
{
struct data ob1;
struct data *buffer = (struct data *)malloc(sizeof(struct data));
if(buffer == NULL)
{
printf("Memory allocation failed\n");
return;
}
ob1.num1 = 1;
ob1.num2 = 2;
ob1.num3 = 3;
ob1.num4 = 4;
memcpy(buffer, &ob1, sizeof(struct data));
}
sizeof(data)
是无效的,除非你已经定义了一个名为data
的变量,或者有一个typedef struct data data
。 - Jim Balter