我想初始化一个struct元素,拆分为声明和初始化。 这就是我所拥有的:

typedef struct MY_TYPE {bool flag;short int value;double stuff;
} MY_TYPE;void function(void) {MY_TYPE a;...a = { true, 15, 0.123 }
}

这是按照C编程语言标准(C89,C90,C99,C11等)声明和初始化MY_TYPE局部变量的MY_TYPE吗? 还是有什么更好的方法,或者至少可以起作用?

更新我最终得到了一个静态初始化元素,在其中根据需要设置了每个子元素。


#1楼

我看到您已经收到有关ANSI C 99的答案,因此,我将介绍ANSI C89。ANSI C 89允许您通过以下方式初始化结构:

typedef struct Item {int a;float b;char* name;
} Item;int main(void) {Item item = { 5, 2.2, "George" };return 0;
}

要记住的重要一点是,即使在结构中初始化一个对象/变量时,其所有其他变量也会被初始化为默认值。

如果不初始化结构中的值,则所有变量都将包含“垃圾值”。

祝好运!


#2楼

正如罗恩·努尼(Ron Nuni)所说:

typedef struct Item {int a;float b;char* name;
} Item;int main(void) {Item item = {5, 2.2, "George"};return 0;
}

要记住的重要事项:在结构中甚至初始化一个对象/变量时,其所有其他变量都将被初始化为默认值。

如果您不初始化结构体中的值(即仅声明该变量),则只有声明是局部的 ,所有variable.members都将包含“垃圾值”

如果声明是全局的或静态的 (如本例所示),则所有未初始化的variable.members将自动初始化为:

  • 整数和浮点数为0
  • char'\\0' (当然,这与0相同,并且char是整数类型)
  • 指针为NULL

#3楼

如果MS尚未更新为C99,则MY_TYPE a = {true,15,0.123};


#4楼

void function(void) {MY_TYPE a;a.flag = true;a.value = 15;a.stuff = 0.123;
}

#5楼

你差不多了...

MY_TYPE a = { true,15,0.123 };

快速搜索'struct initialize c' 向我展示了这个


#6楼

a = (MYTYPE){ true, 15, 0.123 };

可以在C99中很好用


#7楼

您可以使用复合文字来实现 。 根据该页面,它可以在C99(也计为ANSI C )中工作。

MY_TYPE a;a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 };
...
a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };

初始化程序中的指定是可选的; 您还可以写:

a = (MY_TYPE) { true,  123, 0.456 };
...
a = (MY_TYPE) { false, 234, 1.234 };

#8楼

在(ANSI)C99中,可以使用指定的初始化程序来初始化结构:

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };

编辑:其他成员初始化为零:“省略的字段成员隐式初始化为与具有静态存储持续时间的对象相同。” ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )


#9楼

我发现了另一种初始化结构的方法。

结构:

typedef struct test {int num;char* str;
} test;

初始化:

test tt = {num: 42,str: "nice"
};

根据GCC的文档,此语法自GCC 2.5起已过时 。


#10楼

我不喜欢这些答案,所以我自己做了。 我不知道这是否是ANSI C,它只是默认模式下的GCC 4.2.1。 我永远都不记得括号,所以我从我的数据子集开始,并与编译器错误消息作斗争,直到它关闭为止。 可读性是我的首要任务。

    // in a header:typedef unsigned char uchar;struct fields {uchar num;uchar lbl[35];};// in an actual c file (I have 2 in this case)struct fields labels[] = {{0,"Package"},{1,"Version"},{2,"Apport"},{3,"Architecture"},{4,"Bugs"},{5,"Description-md5"},{6,"Essential"},{7,"Filename"},{8,"Ghc-Package"},{9,"Gstreamer-Version"},{10,"Homepage"},{11,"Installed-Size"},{12,"MD5sum"},{13,"Maintainer"},{14,"Modaliases"},{15,"Multi-Arch"},{16,"Npp-Description"},{17,"Npp-File"},{18,"Npp-Name"},{19,"Origin"}};

数据可能以制表符分隔的文件开始,您可以搜索该数据并替换成其他内容。 是的,这是Debian的东西。 因此,一对外部{}(表示数组),然后对内部的每个结构另外一对。 之间用逗号分隔。 将内容放到标头中并不是绝对必要的,但是我的结构中已有大约50个项目,因此我希望将它们放在一个单独的文件中,既可以避免代码混乱,而且更容易替换。


#11楼

C编程语言标准ISO / IEC 9899:1999 (通常称为C99)允许使用指定的初始化程序来初始化结构或联合的成员,如下所示:

MY_TYPE a = { .stuff = 0.456, .flag = true, .value = 123 };

在ISO / IEC 9899:1999标准的第6.7.8 Initializationparagraph 7段中将其定义为:

如果指定人具有表格
。 识别码
那么当前对象(定义如下)应具有结构或联合类型,并且标识符应为该类型成员的名称。

请注意,同一部分的paragraph 9段指出:

除非另有明确说明,否则出于本节的目的,结构和联合类型的对象的未命名成员不参与初始化。 结构对象的未命名成员即使在初始化后也具有不确定的值。

然而,在GNU GCC实现中,省略的成员被初始化为零或类似零的类型合适的值。 如第6.27节“ GNU GCC 指定的初始化程序”所述:

忽略字段成员的隐式初始化与具有静态存储持续时间的对象相同。

根据官方博客文章C ++一致性路线图, Microsoft Visual C ++编译器自2013版以来应支持指定的初始化程序 。 MSDN Visual Studio文档中的“ 初始化 Initializing unions and structs ”段落建议,未命名的成员类似于GNU GCC一样初始化为类似于零的适当值。

已取代ISO / IEC 9899:1999的ISO / IEC 9899:2011标准(俗称C11)保留了第6.7.9 Initialization节“初始化”下的指定初始化器。 它还保留paragraph 9不变。

已取代ISO / IEC 9899:2011的新ISO / IEC 9899:2018标准(通常称为C18)保留了第6.7.9 Initialization节“初始化”下的指定初始化器。 它还保留paragraph 9不变。


#12楼

C中的结构可以这样声明和初始化:

typedef struct book
{char title[10];char author[10];float price;
} book;int main() {book b1={"DS", "Ajay", 250.0};printf("%s \t %s \t %f", b1.title, b1.author, b1.price);return 0;
}

#13楼

我已经阅读了有关初始化聚合类型的Microsoft Visual Studio 2015文档,在此说明了使用{...}进行初始化的所有形式,但是此处未提及使用点进行初始化(名为“指定符”)的情况。 它也不起作用。

C99标准的章节6.7.8初始化说明了指定符的可能性,但是在我看来,对于复杂的结构并不清楚。 C99标准为pdf 。

在我看来,

  1. 使用= {0}; -初始化所有静态数据。 机器代码的工作量较小。
  2. 例如,使用宏进行初始化

    typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}

可以修改宏,其参数列表可以独立于更改的结构内容。 如果应初始化较少的元素,则是适当的。 对于嵌套结构也很合适。 3.一个简单的形式是:在子例程中初始化:

void init_MyStruct(MyStruct* thiz, int a, int b) {thiz->a = a; thiz->b = b; }

这个程序看起来像面向对象的C,使用thiz ,不是this用C编译++呢!

MyStruct data = {0}; //all is zero!
init_MyStruct(&data, 3, 456);

#14楼

我一直在寻找初始化我的结构的好方法,并且必须使用下面的代码(C99)。 这使我可以用与普通类型相同的方式初始化单个结构或结构数组。

typedef struct {char *str;size_t len;jsmntok_t *tok;int tsz;
} jsmn_ts;#define jsmn_ts_default (jsmn_ts){NULL, 0, NULL, 0}

可以在代码中将其用作:

jsmn_ts mydata = jsmn_ts_default; /* initialization of a single struct */jsmn_ts myarray[10] = {jsmn_ts_default, jsmn_ts_default}; /* initialization offirst 2 structs in the array */

如何根据C编程语言标准初始化结构相关推荐

  1. 【嵌入式】C语言高级编程-数组和结构体初始化(02)

    00. 目录 文章目录 00. 目录 01. 初始化概述 02. 指定初始化数组元素 03. 指定初始化结构体成员变量 04. Linux内核中应用 05. 初始化总结 06. 附录 01. 初始化概 ...

  2. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  3. 串口初始化结构体和固件库讲解

    串口初始化结构体和固件库讲解 常用的6个函数,结构体: USART 初始化结构体(USART_InitTypeDef) USART 时钟初始化结构体(USART_ClockInitTypeDef) 串 ...

  4. IEC的PLC编程语言标准 IEC61131-3

    IEC的PLC编程语言标准(IEC61131–3) 中有5种编程语言: 1)顺序功能图(Sequential function chart) : 2)梯形图(Ladder diagram): 3)功能 ...

  5. 简单介绍C语言使用四种方法初始化结构体

    这篇文章说明了什么是结构体,介绍了结构体的概念和使用优点,在C语言中如何使用和初始化结构体方法,通过详细的代码展开进行说明,希望该篇文章对你有所帮助 什么是结构体 在实际问题中,一组数据往往有很多种不 ...

  6. 构造函数初始化结构体

    构造函数初始化结构体 虽然初始化列表易于使用,但它有两个缺点: 如果有某个成员未被初始化,那么在这种情况下,跟随在该成员后面的成员都不能初始化. 如果结构体包括任何诸如字符串之类的对象,那么在许多编译 ...

  7. 阿里巴巴对Java编程【应用结构】的规约

    转载自 阿里巴巴对Java编程[应用结构]的规约 应用分层 1. [推荐]图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于Web 层,也可以直接依赖于 Service 层,依此 ...

  8. c++语言 结构体初始化,结构体变量初始化

    数组的初始化,需要通过一常量数据列表,对其数组元素分别进行初始化,形式如下: 数据类型 数组名称[数组长度]={初始化值1,初始化值2,-, 初始化值n}; 例如,定义长度为5的整型数组,并对其初始化 ...

  9. Go语言初始化结构体的几种方式

    结构体在实例化时可以直接对成员变量进行初始化,初始化有两种形式分别是以字段"键值对"形式和多个值的列表形式,键值对形式的初始化适合选择性填充字段较多的结构体,多个值的列表形式适合填 ...

最新文章

  1. 推荐5款实用的jQuery时间轴插件
  2. Tensorflow 可视化 TensorBoard 尝试~
  3. 华为云力推“普惠AI”,EI智能体正在落地行业
  4. Xcode 真机程序发布测试
  5. 单点登陆的ASP.NET应用程序设计[zt]
  6. JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
  7. LwIP 之四 超时处理/定时器(timeouts.c/h)
  8. form表单提交时,同一个名字的input类型的两个同时提交会覆盖吗
  9. 自动控制原理第二版王建辉_王建辉自动控制原理配套题库名校考研真题课后答案资料课后习题章节题库模拟试题...
  10. postman提取返回值
  11. android的读取xml配置文件,android中XMl文件的读取
  12. 《jQuery、jQuery UI及jQuery Mobile技巧与示例》——7.4 示例:使用按钮集装饰单选框...
  13. 给开源项目贡献代码_您可以为开源做出6种非代码贡献
  14. Program Remote Key For 2014 Ford Mustang Via SKP-900
  15. js call和apply方法小结
  16. java基础[多态基础,多态数组,多态参数方法]
  17. html中hidden属性小案例
  18. ST-Link资料02_ST-Link固件介绍,及固件命名规则
  19. 2017年05月13日勒索软件, 勒索病毒(WannaCry)肆虐全球, 中国安全防线严重受挫
  20. javaScript和html的区别与联系

热门文章

  1. YOU SAY THE RULE IS HERE,BUT I SAY WHY?
  2. Ubuntu adb 报错:no permissions (user in plugdev group; are your udev rules wrong?);
  3. 微型计算机存取速度,微型计算机中,存取速度由快到慢排序:
  4. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...
  5. RxSwift处理Error事件
  6. 机试记不住头文件_计算机考研机试攻略
  7. Java蓝桥杯——贪心算法
  8. 16.oauth2 + oidc 实现 client部分
  9. python CST中国标准时间格式转换
  10. Python 基础 - Day 5 Learning Note - 模块 之 标准库:xml (9)