请教c语言结构体初始化带指针的问题(能qq语音更好)坐等,感谢

&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!C语言 结构体指针问题请教。
[问题点数:30分]
C语言 结构体指针问题请教。
[问题点数:30分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年6月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。C语言大型项目中那些结构体是如何定下来,操作系统里有些结构体特别复杂,好多指针指向链表,他们如何设计?
按投票排序
1、有充分研究的、有RFC的,如TCP协议栈之类,按照协议规定/论文定义。2、没有充分研究的,尽量研究充分,然后按照研究成果定义。PS:研究可大可小。关键思路是:问题分解。每个模块解决一个子问题,每个模块对外数据结构恒定;模块内部则可因地制宜。举例来说,设计一个可传输任意数据的协议,如TCP/IP协议,设计思路是:A、定义TCP/IP协议本身需要的各种字段B、定义报头长度、报文长度等字段,以便用户加入报文C、设计代码,完成投递报文、保证报文完整性等功能显然,这里仅仅解决了TCP/IP协议相关功能;用户数据是什么鬼样子,我们根本就不在乎——只要我们设计一个机制,允许用户在我们的数据报文中加入任意内容(不管这些内容数据结构有多复杂)就行了(但不允许动我们的报头,否则会妨碍TCP/IP协议的正常功能)。这个思路,就叫“依赖倒置”:不是“被服务模块”根据自己的需要,去要求TCP/IP协议必须能传什么数据;而是TCP/IP协议给“被服务模块”一个约定,只要满足这个约定,就可以使用tcp/ip传输数据。(对TCP协议来说,这个约定就是“任何连续存放的、指定有长度的字节数据”:把满足这个约定的数据提交给已经建立的tcp链路,它就保证能替你发出去)。类似的,http协议,它本身就是TCP协议的载荷;同时,它也定义了自己的报文格式,规定了如何给自己附加载荷——如果你从tcp开始追,追到http,这数据结构自然是庞大、复杂、扯来扯去的。再如,我们需要做一个进程调度器,假设每个进程需要在进程控制块中保留一份自己的环境变量信息,那么我们需要具体定义一个用来存储环境变量的数据结构吗?答案是:不需要。只要我们定义一个指针,允许进程管理器或其它什么模块,通过这个指针,把环境变量挂接进来就是了。——至于指针类型,可以是void *,这可以允许不同的进程管理器自定义自己的环境变量格式;也可以是某个具体的数据结构(但这个数据结构原始定义可能是void*,将来进程管理器组开始工作时,再修改成具体的数据结构)。明白了吗?具体完成TCP/IP或进程调度功能的模块,使用的数据结构是相对简单、单一的;只是根据需要,它们可能允许其它模块在自己的数据结构中附加内容,只是对附加内容的格式可能有所要求而已。正是这种附加协议,制造出了那些跨N个模块、层峦叠嶂的、巨大无比、复杂无比的数据结构。如果没有模块概念,贸然去分析这种数据结构,肯定是越看越晕;贸然去写程序,肯定也是越弄越复杂,越弄越写不下去。正确的分析方法,应该是先找到每个子模块,查看每个子模块的输入输出数据结构,弄明白每个模块的功能,并注意不同模块之间的数据是通过什么协议交互、挂接的。——设计类似,也是先找出子模块,定义模块功能和输入输出数据;对那些需要对外提供服务的模块,则可能就要设计类似附加指针、预留空白字段、预留数据结构等方式,允许其它模块附加“载荷”正是“附加载荷”这个需求,弄出了那些看起来东拉西扯、庞大无比的数据结构:但,当你把载荷看做载荷时,好的设计一定是非常简洁的。
结构体的设计主要考虑几个问题:1. 编译环境无关,主要就是sizeof问题,尽量用typedef过的类型,比如DWORD uint32_t,可以准确控制大小,另外字节对齐也要考虑,最好用#pragma pack也指定对齐方式,可以做到兼容32 64位。2. 节约空间,声明的顺序要想好,最好按照字节对齐摆放,如果你非要一个 char,一个int地间隔声明就会浪费很多空间。另外用 数组还是指针加长度,要好好考虑下,在可预见的未来长度有限就用数组,否则指针加长度,指针加长度毕竟会导致多一块内存分配,而且这样结构体不能简单地通过memcpy复制了,要慎重。如果有好多bool型的值,可以考虑用位来表示
struct { int x:1, int y:1 int z:1 },或者声明成DWORD,然后用按位声明的值去或出来,比如 Windows style, WS_VISIBLE | WS_CAPTION3. 前后兼容,如果未来可能会修改的,最好在结构体开头放一个 version,表示版本,使用者要注意检查版本号,可以保持前后兼容,修改了声明就改下版本号。Windows的做法是放一个cbSize,反正通常改结构体的话sizeof也是会变的。保留几个 reserve供未来使用也可以。4. 命名,我喜欢给结构体一个统一的前缀,而且全大写,让人一眼就看出这是个结构,和其他的class interface区分开。
刚开始定义几个预习设计的数据成员,可能是其他模块需要的数据结构。然后开始写代码,写着写着,需要什么新数据成员,再往结构体里面加。慢慢的,后来发现结构体里的成员太多了,然后把可以将分类的成员放在一个新定义的结构体里。最后。很多结构体就像现在你看到的这样。。。。把同类型的结构体用链表串起来,方便查找而已。。
首先确定选择何种设计模式和算法,不同的设计模式要求不同的数据结构,然后进行代码分层,确定各层的工作,从这些限制和依赖上倒推出核心数据结构,最后加入一些可扩展部分。
C的大型项目中的设计需要注意的很多。系统写,估计可以写书了……这里就罗列点目前能想到的。(都是血泪哦)先说说题主说的数据结构方面的:工具结构体一定要和业务结构体脱离。任何结构体内的函数指针一定需要有显式声明。并设置相关warning为打开。多实例结构体,如果不得不用链表实现,那么最好能实现线程安全的读插删接口。不得直接访问结构体指针。 的答案是正确的。早期一定在配置类的结构体内,保留冗余空间。如果是RTOS or 无操作系统的大中型项目。数据结构需要根据不同的MCU做相应优化。再说点其他的:头文件的引用顺序最好有专人负责。开关类宏,一定要有良好的测试用例。如果和数据库打交道,专用存取者的线程一定要干净明了,不可以掺杂哪怕是个小转义的业务逻辑。全局变量的实现体位置一定要慎之又慎。大型项目中,一个g.c申明所有全局变量的方法是不可取的(虽然小项目用这个很舒服)。源码文件命名、目录结构要有清晰文档说明。makefile最好专人负责。尤其是dep相关的……绝对需要做到每日版本。能自动build当然就更好了。版本迭代如果不仔细,绝对是灾难前奏……开掉任何偷懒不进行单元测试的人。所有注释使用英语。如果真难实现,那就有专用脚本将所有代码文件转为UTF8。日志、日志。在不影响开发性能情况下,debug日志要丰富、好用。最起码能有二进制RAW数据导出。
数据,函数,我觉得基本上都是按照面向对象的方法定义的,你看一下linux 驱动程序,基本都是数据,函数指针(方法)类似c++的纯虚函数接口定义,如果有扩展的就是用,void* priv来定义一个指针,具体以后再按需求定义。基本上你可以把整个程序,看成一坨一坨的数据,以及围绕这些数据的方法,外包接口。就像太阳系带着几个混蛋行星一样。
操作系统中的结构体设计,也要遵循结构体设计的一般原则哒。
已有帐号?
无法登录?
社交帐号登录请问,在C语言中,怎么用结构体指针引用成员变量?怎么对成员变量赋值?_百度知道
请问,在C语言中,怎么用结构体指针引用成员变量?怎么对成员变量赋值?
score)。在创建链表中;引用
puts(p-&// char sex[1];%d &} ,则运行没问题struct Info{ char name[10];如果把数组name和sex注释掉;
pnew-&typedef struct Info
NODE; int age,p-&gt: pnew-&name = name,销毁链表; struct Info *sex); int score,创建链表;score =;age =next = NULL;%d &quot,怎么对char name[10]赋值;sex= sex?在显示链表中怎么引用name[10]的值;赋值
puts(p-&next =
printf (&&#47,显示链表; char stop,解决一下?就类似于如下程序;
printf (&age);
pnew-&&#47,p-&
tail-&name);;然后运用链表知识
我有更好的答案
之后再puts(p-&);My Name&是不对的你的pnew-&gt, &name,比如strcpy(pnew-&gt,字符串的拷贝应该用strcpy函数;name =name)
对于字符串正确的做法是这样:strcpy(pnew-&name, &灰太狼&);如果是结构中的数组,则应该用memcpy函数幅值。把分交出来吧
和正常使用字符串是一样的,p-&name就是字符串。也可以p-&name[0]去特定字符。
其他类似问题
为您推荐:
成员变量的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 c语言结构体初始化 的文章

 

随机推荐