原创 【原创】结构体指针

2010-3-21 15:31 2550 3 5 分类: 软件与OS

首先自己定义了一个结构体


typedef struct ElecStateStruct


{


    char elec_name[20];    //电器名字


    char elec_state[10];         //电器当前状态


} ElecStateStruct;


然后申明了一个全局结构体指针


ElecStateStruct *home_elec;


在主程序中对其分配内存(如果不分配的话很有可能不能对结构体中的成员赋值,因为其内存地址未定,所以结构体指针一定要分配内存空间。)


home_elec = (ElecStateStruct*)malloc(sizeof(ElecStateStruct));   


memset(home_elec,0, sizeof(ElecStateStruct));


内存空间分配好后最好是用memset()来清空一下内存,不然后可能读到一些乱七八糟的东西。


在后面的操作中我有这样一段程序:


…………


strcpy(home_elec->elec_name,column_date[0]);//取得家电名称,放入数组中


strcpy(home_elec->elec_state,column_date[1]);//取得家电状态放入数组中


home_elec+=1;


…………


乍一看没有任何问题,因为我定义的是一个指针,所以我对指针变量自增就相当于移向下一个内存地址,依然可以进行存取,可错就错在这个自增上面了!


当我的结构体很小,比如里面的数组只占据几个字节的空间,而且这个结构体指针也用的很少,也就是所我需要的内存空间不大的时候,程序能相安无事,顺利执行。可是当我有大量这样的结构体需要储存的时候就发生错误了。我一直不停的自增,到最后程序崩溃!


刚开始一直找不到原因,因为我下面有一行代码依然分配了一定的内存空间,一旦运行到这行代码就发生了崩溃,还以为是这行代码的问题,后来做实验,把结构体中的数组改成很大很大,结果结构体只要自增就马上崩溃了!感觉就是结构体指针所指的内存只有当前分配的这个地方可以用,后面的都不能用一样。


       GOOGLE了一番,没有找到确切的答案,不过关于结构体的应用倒是找到了不少东西。最后左想右想没办法只有在分配空间的时候根据我的需要预先分配好,如果有3个结构体要存。我就先分配3个这样大的空间。呵呵,这样一来还真的不出错了!


       后来想了一下,觉得确实是内存分配上的问题,指针只是指向了一块内存区域,这块区域里面有什么东西是不定的,所以在移动指针的时候很可能发生把程序中还有用的数据覆盖的事情,所以为了安全以后用指针的时候一定要分配好需要的空间。

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1622076 2015-5-7 11:40

关于结构体和指针还是有很深的门道的。值得研究

用户563713 2010-5-2 19:43

“后来想了一下,觉得确实是内存分配上的问题,指针只是指向了一块内存区域,这块区域里面有什么东西是不定的,所以在移动指针的时候很可能发生把程序中还有用的数据覆盖的事情,所以为了安全以后用指针的时候一定要分配好需要的空间。” --不是这回事吧?home_elec是一个指向只分配一个ElecStateStruct大小的空间,怎么能做home_elec指针变量自增操作呢?增加后指向一个未知的内存地址,这是崩溃的原因。
相关推荐阅读
huotingtu_505472073 2014-01-12 22:18
嵌入式程序员面试问题集锦
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意...
huotingtu_505472073 2011-04-14 23:24
【转】一种实用的步进电机驱动电路
1 引言步进电动机是一种将电脉冲信号转换成角位移或线位移的精密执行元件,由于步进电机具有控制方便、体积小等特点,所以在数控系统、自动生产线、自动化仪表、绘图机和计算机外围设备中得到广泛应用。微电子学的...
huotingtu_505472073 2011-04-14 23:22
【转】几种微型电机驱动电路分析
 以下所述电路用于3V供电的微型直流电机的驱动,这种电机有两根引线,更换两根引线的极性,电机换向。该驱动电路要求能进行正反转和停止控制。 电路一: 如下图所示,这电路是作者最初设计的电路,P1.3、P...
huotingtu_505472073 2011-02-18 19:57
【转】集成运放组成的电压比较器
1. 功能及应用:主要用来判断输入信号电位之间的相对大小,它至少有两个输入端及一个输出端,通常用一个输入端接被比较信号Ui,另一个则接基准电压VR 定门限电压(或称阀值)的UT。输出通常仅且仅有二...
huotingtu_505472073 2011-01-26 08:05
【转】直流无刷电动机工作原理与控制方法12
研究结果表明,在半导体薄片上产生的霍尔电动势E可用下式表示: 式中RH ——霍尔系数(  );IH——控制电流(A);B——磁感应强度(T);d——薄片厚度(m);p——材料电阻率(Ω*s);...
huotingtu_505472073 2011-01-26 07:55
【转】直流无刷电动机工作原理与控制方法1
序言   由于直流无刷电动机既具有交流电动机的结构简单、运行可靠、维护方便等一系列优点,又具备直流电动机的运行效率高、无励磁损耗以及调速性能好等诸多优点,故在当今国民经济各领域应用日益普及。   一个...
EE直播间
更多
我要评论
2
3
关闭 站长推荐上一条 /3 下一条