关于结构体数组的初始化

bxfq 2009-06-26 11:48:32
现有
struct D{
struct C cc;
int ii;
}
struct C{
struct B bb;
int jj ;
}
struct B{
unsiged xx:4;
unsiged reserved :28;}
定义全局变量
struct D dd[512];
如何单个初始化结构体:


int init()
{
dd[1] = {{{4,100},20},20};
//and so on
//dd[10] = {};
}
这样写编译不过;
该如何初始化呢
...全文
116 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bxfq 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ies_sweet 的回复:]
如果需要对每个成员都生成一个默认的合法数值
唯一的可靠办法就是对每一个成员进行赋值

否则,任何直接操作内存的做法,都需要建立在对编译器了解的基础上
所以说,这样写出来的代码很可能是不可移植的

强烈建议不要怕书写麻烦
因为你书写很麻烦
可能意味着计算机运行起来简单

写代码
不要依赖于编译器的表现

帮顶了
[/Quote]
谢谢,跑在2个平台实时linux系统上的
bxfq 2009-06-26
  • 打赏
  • 举报
回复
谢谢大家积极发言,看了supermegaboy的回复,我一共有一千多个个check项;
那还是退回老方法去,定义时就給初始化值
ies_sweet 2009-06-26
  • 打赏
  • 举报
回复
如果需要对每个成员都生成一个默认的合法数值
唯一的可靠办法就是对每一个成员进行赋值

否则,任何直接操作内存的做法,都需要建立在对编译器了解的基础上
所以说,这样写出来的代码很可能是不可移植的

强烈建议不要怕书写麻烦
因为你书写很麻烦
可能意味着计算机运行起来简单

写代码
不要依赖于编译器的表现

帮顶了
飞天御剑流 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 bxfq 的帖子:]
现有
struct D{
struct C cc;
int ii;
}
struct C{
struct B bb;
int jj ;
}
struct B{
unsiged xx:4;
unsiged reserved :28;}
定义全局变量
struct D dd[512];
如何单个初始化结构体:


int init()
{
dd[1] = {{{4,100},20},20};
//and so on
//dd[10] = {};
}
这样写编译不过;
该如何初始化呢
[/Quote]

你dd[1] = {{{4,100},20},20}; 这东西是错误的语法,{}只能用于声明过程中的初始化,不能用于赋值,dd[1]=这样已经是赋值了。

你的问题可以有几种方法初始化:

第一种:
dd[1].cc.bb.xx = 2;
dd[1].cc.bb.reserved = 1000;
dd[1].cc.jj = 500;
dd[1].ii = 100;

这方法比较烦,要写很多行。



第二种:
struct D dd[512] = { { { { 2, 1000 }, 500 }, 100 }, { { { 4, 2000 }, 550 }, 200 },
...................................
...................................
....................................
{ { { 6, 1500 }, 600 }, 300 } };


第三种:

struct D *p = (struct D *)malloc( 512 * sizeof( struct D ) );
............... //省略的代码是往p中指向的区域填充数据
memcpy( dd, p, 512 * sizeof( struct D ) );
lingyin55 2009-06-26
  • 打赏
  • 举报
回复
下面这个在vs2008下编译通过。

struct B{ /////注意结构体位置,而且你的unsigned类型也写错了
unsigned xx:4;
unsigned reserved :28;
};
struct C{
struct B bb;
int jj ;
};
struct D{
struct C cc;
int ii;
};

struct D dd[512] = { {{{4,100},20},20},{{{4,200},30},40} };/////
int main()
{
return 0;
}
cqzj119 2009-06-26
  • 打赏
  • 举报
回复
要初始化為0, 可以用于memset,
要初始化為其他值,沒辦法,得一個一個設定。
lee673 2009-06-26
  • 打赏
  • 举报
回复
帮顶
  • 打赏
  • 举报
回复
好累,我都直接用memset来初始化的。
goodname 2009-06-26
  • 打赏
  • 举报
回复
离散的只能按照成员一个个的来。或者如果你已经有一个模板成员了,也可以使用memset来整体进行赋值也可以。
或者如果相似程度比较高,可以先使用模板整体赋值,然后单项改动一下不同的成员,也许效率稍微有些损失。
bxfq 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kernxn 的回复:]
顺序问题啊,楼主,把三个结构定义顺序倒换一下就可以了
[/Quote]
何解?
dd[512]={{{4,100},20},20};
变成楼下的?
dd[512]= {20 {20,{4,100}}};
不合理啊
bxfq 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 goodname 的回复:]
C/C++ codestructB{
unsigned xx:4;
unsigned reserved :28;};structC{structB bb;intjj ;
};structD{structC cc;intii;
};intinit()
{structD dd[512]={{},{{{4,100},20},20}};return0;
}
[/Quote]
我需要离散的初始化结构体;
可以一个一个得定义:
dd[10] = {{{4,100},20},20};
dd[23]= {{{6,100},20},20};
可以有这种形式去初始化吗?
PS:以前就是这种做法,在定义时初始化;
kernxn 2009-06-26
  • 打赏
  • 举报
回复
顺序问题啊,楼主,把三个结构定义顺序倒换一下就可以了
bxfq 2009-06-26
  • 打赏
  • 举报
回复
不行 我要默认一份有效的数据
[Quote=引用 1 楼 Loaden 的回复:]
memset
[/Quote]
goodname 2009-06-26
  • 打赏
  • 举报
回复

struct B{
unsigned xx:4;
unsigned reserved :28;};
struct C{
struct B bb;
int jj ;
};
struct D{
struct C cc;
int ii;
};

int init()
{
struct D dd[512]
= {{},{{{4,100},20},20}};

return 0;
}
jianzhibeihang 2009-06-26
  • 打赏
  • 举报
回复
不会,帮顶了!
老邓 2009-06-26
  • 打赏
  • 举报
回复
memset

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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