首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消引用结构中的可变大小数组

取消引用结构中的可变大小数组
EN

Stack Overflow用户
提问于 2008-10-07 14:57:00
回答 6查看 3.9K关注 0票数 1

Structs似乎是一种解析二进制数据(即文件或网络数据包)的有用方法。在blob中有可变大小的数组之前,这是很不错的。例如:

代码语言:javascript
复制
struct nodeheader{
        int flags;
        int data_size;
        char data[];
};

这使我能够找到最后一个数据字符:

代码语言:javascript
复制
nodeheader b;
cout << b.data[b.data_size-1];

问题是,我想要多个长度可变的数组:

代码语言:javascript
复制
struct nodeheader{
    int friend_size;
    int data_size;
    char data[];
    char friend[];
};

我不会手动分配这些结构。我有一个这样的文件:

代码语言:javascript
复制
char file_data[1024];
nodeheader* node = &(file_data[10]);

因为我正在尝试解析一个二进制文件(更具体地说是一个类文件)。我已经用Java语言写了一个实现(这是我的类作业),不,我正在用C++做一个个人版本,我希望不用写100行代码就能完成。有什么想法吗?

谢谢,斯特凡

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-10-07 15:02:58

不能有多个大小可变的数组。编译器在编译时应该如何知道friend[]的位置?friend的位置取决于data[]的大小,而数据的大小在编译时是未知的。

票数 3
EN

Stack Overflow用户

发布于 2008-10-07 15:06:50

这是一个非常危险的构造,我建议你不要这么做。只有当变长数组是最后一个元素时,才能在struct中包含该数组,并且在这样做时,必须确保分配足够的内存,例如:

代码语言:javascript
复制
nodeheader *nh = (nodeheader *)malloc(sizeof(nodeheader) + max_data_size);

你想做的就是使用常规的动态分配的数组:

代码语言:javascript
复制
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;
}
票数 3
EN

Stack Overflow用户

发布于 2008-10-07 15:05:18

你不能--至少不能用你尝试的这种简单的方式。结构结尾处的未调整大小的数组基本上是到结构结尾处的偏移量,没有内置的方法来找到结尾处。

所有字段都在编译时转换为数字偏移量,因此它们在编译时需要是可计算的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/178838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档