动态定义结构体大小的问题

yorkzjy 2010-01-21 02:49:06
大家好,我有个问题。

假如我先前定一了一个结构体
struct Packet
{
....
int size;
...
uint64_t Value;
}Pkt;

然后在后面的程序中将这个Pkt各个变量初始化之后写到文件中//用 fwrite((void*)&Pkt, sizeof(Pkt)...);

可是现在情况变了,因为发现uint_64 Value 的容量不够存储,需要将uint64_t Value 改成数组的形式,大小是size。然后写这个数组到文件中(动态决定的)。

现在遇到的问题是: 如果定义uint64 *Value 的形式,写进文件的只是一个指向uint64_t 的指针,而我需要的是写数组的值到文件里面。可是size的大小是临时决定的。

不知道有没有办法解决这个问题。

小弟菜,请高手指教。
...全文
289 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gongnai 2010-01-23
  • 打赏
  • 举报
回复
动态不动态的问题 就无所谓了啊 把一个指向缓冲区的指针封装到 结构里面就好了啊.

然后跟据 那个int值 来具体的开辟多大的缓冲区不就搞定了吗? 这个问题的关键就是把一个指针封装到结构

里面就解决问题了啊.
yorkzjy 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lvp1984 的回复:]
sizeof(结构体)在编译时就已经定下来了,怎么动态? 1楼是简单好用的
[/Quote]

我想你是不太明白问题所在了
lvp1984 2010-01-21
  • 打赏
  • 举报
回复
sizeof(结构体)在编译时就已经定下来了,怎么动态? 1楼是简单好用的
we_sky2008 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yorkzjy 的回复:]
引用 7 楼 cattycat 的回复:
你看看5楼说的能不能写入,然后同时把原数组的值读进来,不行的话,就得分开写了。
我还没用过这种功能呢。


刚才试了,分配空间倒是成功,但是当我想写入Value[0],Value[1]的时候编译报错:

error: request for member `Value' in `p', which is of non-class type `Pakcet*


[/Quote]
可以参考下面的例子:
#include<iostream>

using namespace std;

typedef struct
{
int a;
char array[];
}t_struct;

int main()
{
int i = 0;
t_struct *p = (t_struct *)malloc(sizeof(t_struct) + 10*sizeof(char));
p->a = 123;
for (i = 0; i < 10; i++)
p->array[i] = 'a'+i;
for (i = 0; i < 10; i++)
cout<<(p->array[i])<<endl;
return 0;
}
we_sky2008 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yorkzjy 的回复:]
不过我尝试 用不同的length然后用sizeof(*p),怎么都是一样的值啊?
[/Quote]
恩,应该的
length*sizeof(uint64_t)相当于你预留该结构体后的length*sizeof(uint64_t)字节的空间
但是它不包含在结构体里
yorkzjy 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cattycat 的回复:]
你看看5楼说的能不能写入,然后同时把原数组的值读进来,不行的话,就得分开写了。
我还没用过这种功能呢。
[/Quote]

刚才试了,分配空间倒是成功,但是当我想写入Value[0],Value[1]的时候编译报错:

error: request for member `Value' in `p', which is of non-class type `Pakcet*

yorkzjy 2010-01-21
  • 打赏
  • 举报
回复
不过我尝试 用不同的length然后用sizeof(*p),怎么都是一样的值啊?
cattycat 2010-01-21
  • 打赏
  • 举报
回复
你看看5楼说的能不能写入,然后同时把原数组的值读进来,不行的话,就得分开写了。
我还没用过这种功能呢。
yorkzjy 2010-01-21
  • 打赏
  • 举报
回复
太感谢楼上了
we_sky2008 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 we_sky2008 的回复:]
试试用柔性数组
[/Quote]

struct Packet
{
....
int size;
...
uint64_t Value[];
}Pkt;

使用时:
(struct Packet) *p = (struct Packet *)malloc(sizeof(struct Packet)+length*sizeof(uint64_t));
yorkzjy 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 we_sky2008 的回复:]
试试用柔性数组
[/Quote]
谢谢,我上网搜搜看
we_sky2008 2010-01-21
  • 打赏
  • 举报
回复
试试用柔性数组
yorkzjy 2010-01-21
  • 打赏
  • 举报
回复
谢谢,怎样写值进Value数组那里呢?Pkt是非动态的
wuyu637 2010-01-21
  • 打赏
  • 举报
回复
{
...
...
uint_64 *value;
int value_length;

}


使用的时候,sizeof(xxx) + sizeof(uint64)* value_length;

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧