Structs似乎是一种解析二进制数据(即文件或网络数据包)的有用方法。在blob中有可变大小的数组之前,这是很不错的。例如:
struct nodeheader{
int flags;
int data_size;
char data[];
};这使我能够找到最后一个数据字符:
nodeheader b;
cout << b.data[b.data_size-1];问题是,我想要多个长度可变的数组:
struct nodeheader{
int friend_size;
int data_size;
char data[];
char friend[];
};我不会手动分配这些结构。我有一个这样的文件:
char file_data[1024];
nodeheader* node = &(file_data[10]);因为我正在尝试解析一个二进制文件(更具体地说是一个类文件)。我已经用Java语言写了一个实现(这是我的类作业),不,我正在用C++做一个个人版本,我希望不用写100行代码就能完成。有什么想法吗?
谢谢,斯特凡
发布于 2008-10-07 15:02:58
不能有多个大小可变的数组。编译器在编译时应该如何知道friend[]的位置?friend的位置取决于data[]的大小,而数据的大小在编译时是未知的。
发布于 2008-10-07 15:06:50
这是一个非常危险的构造,我建议你不要这么做。只有当变长数组是最后一个元素时,才能在struct中包含该数组,并且在这样做时,必须确保分配足够的内存,例如:
nodeheader *nh = (nodeheader *)malloc(sizeof(nodeheader) + max_data_size);你想做的就是使用常规的动态分配的数组:
struct nodeheader
{
char *data;
size_t data_size;
char *friend;
size_t friend_size;
};
nodeheader AllocNodeHeader(size_t data_size, size_t friend_size)
{
nodeheader nh;
nh.data = (char *)malloc(data_size); // check for NULL return
nh.data_size = data_size;
nh.friend = (char *)malloc(friend_size); // check for NULL return
nh.friend_size = friend_size;
return nh;
}
void FreeNodeHeader(nodeheader *nh)
{
free(nh->data);
nh->data = NULL;
free(nh->friend);
nh->friend = NULL;
}发布于 2008-10-07 15:05:18
你不能--至少不能用你尝试的这种简单的方式。结构结尾处的未调整大小的数组基本上是到结构结尾处的偏移量,没有内置的方法来找到结尾处。
所有字段都在编译时转换为数字偏移量,因此它们在编译时需要是可计算的。
https://stackoverflow.com/questions/178838
复制相似问题