gpt4 book ai didi

c - C结构序列化中的结构填充影响(保存到文件)

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:16 25 4
gpt4 key购买 nike

我在 C 中有以下结构:

typedef struct sUser {
char name[nameSize];
char nickname[nicknameSize];
char mail[mailSize];
char address[addressSize];
char password[passwordSize];
int totalPoints;
PlacesHistory history;
DynamicArray requests;
}User;

typedef struct sPlacesHistory {
HistoryElement array[HistorySize];
int occupied;
int last;
}PlacesHistory;

和功能:

void serializeUser( User * user, FILE * fp ) {
fwrite( user, nameSize + nicknameSize + mailSize + addressSize + passwordSize + sizeof( int ) + sizeof( PlacesHistory ), 1, fp );
serializeDynamicArray( user -> requests, fp );
}

User * loadUser( FILE * fp ) {
User * user = malloc( sizeof( User ) );
fread( user, nameSize + nicknameSize + mailSize + addressSize + passwordSize + sizeof( int ) + sizeof( PlacesHistory ), 1, fp );
user -> requests = loadDynamicArray( fp );

return user;
}

当我加载用户结构并打印该用户(从文件加载)时,placesHistory 的“last”字段的值为 255 或 -1,具体取决于 PlacesHistory 结构的字段顺序。但是我保存的用户对该成员有 -1。

所以当我得到 255 时,它显然是错误的..我怀疑这与结构填充有关。

我怎样才能使结构中字段的顺序无关紧要?
或者我需要遵循哪些标准才能正常工作?
我需要一次 fwrite/fread 一个成员吗? (出于效率问题,我想避免这种情况)
我是否需要先序列化为数组而不是文件? (我希望不是 .. 因为这意味着要事先知道我所有结构的大小,因为 mallocated 数组 - 这意味着额外的工作为每个非简单结构创建一个函数来知道它的大小)

注意:*大小是定义的常量
注2:DynamicArray 是指向另一个结构的指针。

最佳答案

是的,它可能与 totalPointshistory 前面的填充有关。

您可以只写出 sizeof(User) - sizeof(DynamicArray) 并在其中读回。当然,只要您的结构定义和编译器不变,这只会兼容。如果您不需要程序的一个版本的序列化数据与另一个版本兼容,那么上面的方法应该可行。

关于c - C结构序列化中的结构填充影响(保存到文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5557083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com