大家好,很抱歉问这个问题,但我可以找到任何合适的解决方案。 我正在开发一个文件系统,将每个文件节点保存为 GDBM 数据库中的键值对。 我有一个具有一些属性的结构,我将其转换为字节数组
结构 mystruct:
typedef struct nold{
char* name;
char* surname;
int age;
}mystruct;
我将其转换为字节数组
dead.name="john";
dead.surname="doe";
dead.age=22;
//copy bytes of the our struct
char buffer[sizeof(dead)];
memcpy(buffer, &dead, sizeof(dead));
为了存储在数据库中,我们使用如下数据结构:
typedef struct {
char *dptr;
int dsize;
} datum
我填写的数据结构如下:
//create a key datum
char* k="file.txt";
key.dptr=k;
key.dsize=strlen(k)+1;
//create a value datum here I assign bytes
value.dptr=buffer;
value.dsize = sizeof(dead);
现在我将其作为键值对存储在GDBM中
然后在另一个文件中,我读取存储的数据并尝试将其重新转换回结构
datum result;
//read
result=gdbm_fetch(file,key);
char* bytes=result.dptr;
mystruct* reborn;
reborn=(mystruct*)bytes;
//print from our new struct
printf("%s\n",reborn->name);
printf("%s\n",reborn->surname);
printf("%d\n",reborn->age);
它打印以下内容:
E���D$�$ˈ�k����E��
$�$ˈ�k����E��
22
它设法恢复结构,但 char* 的数据丢失了。仅涵盖整数数据。知道为什么会这样吗?怎么解决呢?如果无法通过存储字节数组来解决,那么将字节数组转换为十六进制或base64 并按原样存储即可。
我真的很苦恼这个问题。提前谢谢你。
最佳答案
结构体内部的指针只是指向字符数组的指针,而不是字符数组本身:
typedef struct nold{
char* name;
char* surname;
int age;
}mystruct;
mystruct s;
s.name = "Salam";
这将为字符串“Salam”保留一个内存空间,将字符串Salam放入其中并返回指向s.name的指针。
现在您要将整个结构复制到其他内容中,您正在使用 sizeof(mystruct) 从结构地址复制,它实际上并不保存字符串“Salam”,它只是保存一个指向“Salam”的指针。
如果你想这样做,你必须为名称预先分配一些空间:
#define MAX_NAME_LEN 50
typedef struct nold{
char name[MAX_NAME_LEN];
char surname[MAX_NAME_LEN];
int age;
}mystruct;
mystruct s;
strcpy(s.name, "Salam");
现在 memcpy 可以工作了
mystruct d;
memcpy(&d, &s, sizeof(mystruct);
关于将结构转换为字节数组并存储在数据库中。读取 db 并获取字节数组以在 C 中重新创建结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41166441/