草庐IT

关于结构体初始化的自我小结

cedar_king 2024-02-28 原文

前段时间在一个项目中使用到结构体数组来存储产品不同型号的参数,使程序通用化,便于测试和快速生产。由于之前很少使用结构体数组,在初始化时遇到了一点小阻碍,于是便想到对于结构体和其数组的初始化操作做一个小总结:
结构体
结构体初始化其实有多种方式,以一个经典模板为例:

#include <stdio.h>

struct Student{
	char *name;
	int age;
	float score;
}stu = {"小王",18,80.5};

int main(){
	
	printf("%s %d %.2f\r\n",stu.name,stu.age,stu.score); 
	
	return 0;
}

输出如下:

也可以部分初始化:

#include <stdio.h>

struct Student{
	char *name;
	int age;
	float score;
}stu = {.name = "小王",.age = 18};

int main(){
	
	//printf("%s %d %.2f\r\n",stu.name,stu.age,stu.score); 
	printf("%s %d\r\n",stu.name,stu.age);
	
	return 0;
}


但是在这种方式下需要注意在指明的成员后接未指明的成员时,该未指明成员默认是按顺序初始化指明成员的下一位成员变量:

#include <stdio.h>

struct Student{
	char *name;
	int age;
	float score;
}stu = {.score = 60.5,.name = "小王",18,90.5};

int main(){
	
	printf("%s %d %.2f\r\n",stu.name,stu.age,stu.score); 
	
	return 0;
}

可以看到开始指明初始化了score和name,但是结果却是后面的18和90.5按顺序初始化了name后面的age与score,覆盖了前面指明的60.5。

除了在声明结构体时初始化,也可以在定义变量时初始化,或者定义后再赋值,格式同上面类似:

struct Student{
	char *name;
	int age;
	float score;
}; 
	struct Student stu = {"小王",18,80.5}; 
	struct Student stu = {.name = "小王",.age = 18,.score = 80.5};
	struct Student stu;
	
	stu.name = "小王";
	stu.age = 18;
	stu.score = 80.5;
	struct Student stu;
	struct Student *pstu = &stu;
	
	pstu->name = "小王";
	pstu->age = 18;
	pstu->score = 80.5;

上述方法都可以得到正确的输出。
但是同数组一样,下面的方法是错误的:

	struct Student stu;
	stu = {"小王",18,80.5};

结构体数组
与多维数组的初始化类似,在分清结构体的初始化方式后,结构体数组就很明了了,首先是声明时初始化:

#include <stdio.h>

struct Student{
	char *name;
	int age;
	float score;
}stu[3] = {    //或者不写明成员数量stu[]
	{"小王",18,80.5},
	{"小李",19,85.5},
	{"小赵",20,90.5}
}; 

int main(){
	int i,arrayNum;
	
	arrayNum = sizeof(stu) / sizeof(struct Student);
	
	for(i = 0;i < arrayNum;i++)
		printf("%s %d %.2f\r\n",stu[i].name,stu[i].age,stu[i].score); 
	
	return 0;
}

注意花括号与花括号之间使用的是逗号。

struct Student{
	char *name;
	int age;
	float score;
}stu[3] = {
	"小王",18,80.5,
	"小李",19,85.5,
	"小赵",20,90.5
};
struct Student{
	char *name;
	int age;
	float score;
}stu[3] = {
	[0].name = "小王",18,80.5,
	[1].name = "小李",19,85.5,
	[2].name = "小赵",20,90.5
}; 

均可得到如下的正确输出:

上述三种方式在定义时初始化同样适用:

struct Student{
	char *name;
	int age;
	float score;
}; 
int main(){
	int i,arrayNum;
	
	struct Student stu[3] = {
		"小王",18,80.5,//{"小王",18,80.5},
		"小李",19,85.5,//[1].name = "小李",19,85.5,
		"小赵",20,90.5
	};
	
	arrayNum = sizeof(stu) / sizeof(struct Student);
	
	for(i = 0;i < arrayNum;i++)
		printf("%s %d %.2f\r\n",stu[i].name,stu[i].age,stu[i].score); 
	
	return 0;
}

在定义后再初始化操作同第一节结构体初始化,只不过加了下标,不在赘述。而且下面这种方式仍为错误:

	struct Student stu[3];
	stu[3] = {    //或stu =  
		"小王",18,80.5,
		"小李",19,85.5,
		"小赵",20,90.5
	};

有关关于结构体初始化的自我小结的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  3. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  4. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  5. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  6. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  7. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  8. ruby - 为什么当我调用类的实例方法时,初始化不显示为方法? - 2

    我正在写一篇关于在Ruby中几乎一切都是对象的博客文章,我试图通过以下示例来展示这一点:classCoolBeansattr_accessor:beansdefinitialize@bean=[]enddefcount_beans@beans.countendend所以从类中我们可以看出它有4个方法(当然,除非我错了):它可以在创建新实例时初始化一个默认的空bean数组它可以计算它有多少个bean它可以读取它有多少个bean(通过attr_accessor)它可以向空数组写入(或添加)更多bean(也通过attr_accessor)但是,当我询问类本身它有哪些实例方法时,我没有看到默认

  9. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  10. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

随机推荐