关于结构体赋值的方式

ai_bj 2012-03-23 01:22:43

#include <stdio.h>

typedef struct {unsigned int name[20];} myname;

#define name1 \
(myname){{ \
[0 ... 19] = 1\
}}

int main()
{
myname x;
// x = name1;
x = (myname){{[0 ... 19] = 2}}; //这里是什么意思?
int i;
for(i=0;i<20;i++)
{
printf("%d\n",x.name[i]);
}
return 0;
}
...全文
407 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
autumn1202 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 nossiac 的回复:]
http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits
这个链接新一点。

To initialize a range of elements to the same value, write `[first ... last] = value'. This is a GNU extension. Fo……
[/Quote]

原来如此,学习了!!~~

另外6L的哥们memset用错了,memset是字节操作。
nossiac 2012-03-23
  • 打赏
  • 举报
回复
http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits
这个链接新一点。

To initialize a range of elements to the same value, write `[first ... last] = value'. This is a GNU extension. For example,

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

If the value in it has side-effects, the side-effects will happen only once, not for each initialized field by the range initializer.

Note that the length of the array is the highest value specified plus one.


nossiac 2012-03-23
  • 打赏
  • 举报
回复
这是GCC编译器扩展语法,常用于数组初始化,在标准C中是没有的。
参考官方文档:
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits
ai_bj 2012-03-23
  • 打赏
  • 举报
回复
额,大概明白了
(myname){{[0 ... 19] = 2}};
(myname)是类型转换
第一个{}是给结构体赋初值;
第二个{}是给结构体内的数组赋初值;
C99规定,在初始化列表中使用带有方括号的元素下标可以指定某个特定的元素。
就差[0 ... 19]这个没找到出处了。
自信男孩 2012-03-23
  • 打赏
  • 举报
回复
x = (myname){{[0 ... 19] = 2}}; //这里是什么意思?
我是第一次看到这样给结构体初始化的。这个语句的意思是为结构体中的name成员的20个元素初始化为2.
打印出来的就是都是2.
FlyLinux 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ai_bj 的回复:]
引用 1 楼 czh3642210 的回复:

就是个宏。。。。


宏也有展开的格式吧。这个我已经展开了,不知道是什么意思。
比如x = (myname){{[0 ... 19] = 2}};
为什么要两个{{}},里面的[0 ... 19]又是什么意思。
[/Quote]

因为是一个结构体,所以首先要一个{},而[0 ... 19 ]是给结构体中name数组赋值,结果和memset(name, 2, 20)差不多,如果不是数组,那就不要{}。
jxnuzhouguohong 2012-03-23
  • 打赏
  • 举报
回复
C99规定,在初始化列表中使用带有方括号的元素下标可以指定某个特定的元素。

int array[6]={[5]=212};//把array[5]初始化为212

这是C Primer Plus里面说的
autumn1202 2012-03-23
  • 打赏
  • 举报
回复
结构体也是可以像给数组赋初值一样,用{}来赋初值。
第一个{}是给结构体赋初值;
第二个{}是给结构体内的数组赋初值;
至于[0...19],这个不是集合的表达方式么,长见识了……
后来用gcc3.4试了下,是可以识别的,下面的语句:
int a[20] = {[0 ... 4 ] = 5 };
也是可以工作的,是将数组的前5个赋值为5。
刚查了下,也没找到它的说明,不知道哪位高手看到过这种赋值方式
Alexander 2012-03-23
  • 打赏
  • 举报
回复
LZ用的什么编译器?
在下在VC2008下面似乎通不过编译。
ai_bj 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 czh3642210 的回复:]

就是个宏。。。。
[/Quote]

宏也有展开的格式吧。这个我已经展开了,不知道是什么意思。
比如x = (myname){{[0 ... 19] = 2}};
为什么要两个{{}},里面的[0 ... 19]又是什么意思。
面包大师 2012-03-23
  • 打赏
  • 举报
回复
就是个宏。。。。

69,382

社区成员

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

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