OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 43133|回复: 117

漫谈C语言结构体

  [复制链接]

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
发表于 2014-2-21 22:54:41 | 显示全部楼层 |阅读模式

漫谈C语言结构体

 

相信大家对于结构体都不陌生。在此,分享出本人对C语言结构体的学习心得。如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了。当然,水平有限,若发现不足之处恳请指出。代码文件test.c我放在下面。

在此,我会围绕以下2个问题来分析和应用C语言结构体:

 

1. C语言中的结构体有何作用

2. 结构体成员变量内存对齐有何讲究(重点)

对于一些概念的说明,我就不把C语言教材上的定义搬上来。我们坐下来慢慢聊吧。

==============================================================================================================================================
 

1. 结构体有何作用

三个月前,教研室里一个学长在华为南京研究院的面试中就遇到这个问题。当然,这只是面试中最基础的问题。如果问你你怎么回答?

我的理解是这样的,C语言中结构体至少有以下三个作用:

 

(1)有机地组织了对象的属性。

比如,在STM32RTC开发中,我们需要数据来表示日期和时间,这些数据通常是年、月、日、时、分、秒。如果我们不用结构体,那么就需要定义6个变量来表示。这样的话程序的数据结构是松散的,我们的数据结构最好是“高内聚,低耦合”的。所以,用一个结构体来表示更好,无论是从程序的可读性还是可移植性还是可维护性皆是:

typedef struct   //公历日期和时间结构体

{

    vu16  year;

    vu8   month;

    vu8   date;

    vu8   hour;

    vu8   min;

    vu8   sec;  

}_calendar_obj;  

 _calendar_obj calendar;  //定义结构体变量

 

(2)以修改结构体成员变量的方法代替了函数(入口参数)的重新定义。

如果说结构体有机地组织了对象的属性表示结构体“中看”,那么以修改结构体成员变量的方法代替函数(入口参数)的重新定义就表示了结构体“中用”。继续以上面的结构体为例子,我们来分析。假如现在我有如下函数来显示日期和时间:


void DsipDateTime( _calendar_obj  DateTimeVal)

那么我们只要将一个_calendar_obj这个结构体类型的变量作为实参调用DsipDateTime()即可,DsipDateTime()通过DateTimeVal的成变量来实现内容的显示。如果不用结构体,我们很可能需要写这样的一个函数:


void DsipDateTime( vu16 yearvu8 monthvu8 datevu8 hourvu8 minvu8 sec)

显然这样的形参很不可观,数据结构管理起来也很繁琐。如果某个函数的返回值得是一个表示日期和时间的数据,那就更复杂了。这只是一方面。

另一方面,如果用户需要表示日期和时间的数据中还要包含星期(),这个时候,如果之前没有用机构体,那么应该在DsipDateTime()函数中在增加一个形参vu8 week

void DsipDateTime( vu16 yearvu8 monthvu8 datevu8 weekvu8 hourvu8 minvu8 sec)

可见这种方法来传递参数非常繁琐。所以以结构体作为函数的入口参数的好处之一就是

函数的声明void DsipDateTime( _calendar_obj  DateTimeVal)不需要改变,只需要增加结构体的成员变量,然后在函数的内部实现上对calendar.week作相应的处理即可。这样,在程序的修改、维护方面作用显著。

typedef struct   //公历日期和时间结构体

{

    vu16  year;

    vu8   month;

    vu8   date;

    vu8  week;

    vu8   hour;

    vu8   min;

    vu8   sec;  

}_calendar_obj;  

 _calendar_obj calendar;  //定义结构体变量

 

    (3)结构体的内存对齐原则可以提高CPU对内存的访问速度(以空间换取时间)
    并且,结构体成员变量的地址可以根据基地址
(以偏移量
offset)计算。我们先来看看下面的一段简单的程序,对于此程序的分析会在第2部分结构体成员变量内存对齐中详细说明。

 

#include<stdio.h>

 

int main()

{

    struct  //声明结构体char_short_long

    {

        char  c;

        short s;

        long  l;

    }char_short_long;

 

    struct  //声明结构体long_short_char

    {

        long  l;

        short s;

        char  c;
    }long_short_char;

 

    struct  //声明结构体char_long_short

    {

        char  c;

        long  l;

        short s;

    }char_long_short;

 

    printf(" \n");

    printf(" Size of char   = %d bytes\n",sizeof(char));

    printf(" Size of shrot  = %d bytes\n",sizeof(short));

    printf(" Size of long   = %d bytes\n",sizeof(long));

    printf(" \n"); //char_short_long

    printf(" Size of char_short_long       = %d bytes\n",sizeof(char_short_long));

    printf("     Addr of char_short_long.c = 0x%p (10进制:%d)\n",&char_short_long.c,&char_short_long.c);

    printf("     Addr of char_short_long.s = 0x%p (10进制:%d)\n",&char_short_long.s,&char_short_long.s);

    printf("     Addr of char_short_long.l = 0x%p (10进制:%d)\n",&char_short_long.l,&char_short_long.l);

    printf(" \n");

 

    printf(" \n"); //long_short_char

    printf(" Size of long_short_char       = %d bytes\n",sizeof(long_short_char));

    printf("     Addr of long_short_char.l = 0x%p (10进制:%d)\n",&long_short_char.l,&long_short_char.l);

    printf("     Addr of long_short_char.s = 0x%p (10进制:%d)\n",&long_short_char.s,&long_short_char.s);

    printf("     Addr of long_short_char.c = 0x%p (10进制:%d)\n",&long_short_char.c,&long_short_char.c);

    printf(" \n");

 

    printf(" \n"); //char_long_short

    printf(" Size of char_long_short       = %d bytes\n",sizeof(char_long_short));

    printf("     Addr of char_long_short.c = 0x%p (10进制:%d)\n",&char_long_short.c,&char_long_short.c);

    printf("     Addr of char_long_short.l = 0x%p (10进制:%d)\n",&char_long_short.l,&char_long_short.l);

    printf("     Addr of char_long_short.s = 0x%p (10进制:%d)\n",&char_long_short.s,&char_long_short.s);

    printf(" \n");

    return 0;

}

 

程序的运行结果如下(注意:括号内的数据是成员变量的地址的十进制形式)



 

2. 结构体成员变量内存对齐

首先,我们来分析一下上面程序的运行结果。前三行说明在我的程序中,char型占1个字节,short型占2个字节,long型占4个字节。char_short_longlong_short_charchar_long_short是三个结构体成员相同但是成员变量的排列顺序不同。并且从程序的运行结果来看, 

       Size   of   char_short_long    = 8 bytes
    Size of long_short_char = 8 bytes
    Size of char_long_short = 12 bytes  //比前两种情况大4 byte 

    并且,还要注意到,1 byte (char)+
2 byte (short)+ 4 byte (long) = 7 byte,而不是8 byte。

   所以,结构体成员变量的放置顺序影响着结构体所占的内存空间的大小。一个结构体变量所占内存的大小不一定等于其成员变量所占空间之和。如果一个用户程序或者操作系统(比如uC/OS-II)中存在大量结构体变量时,这种内存占用必须要进行优化,也就是说,结构体内部成员变量的排列次序是有讲究的。

结构体成员变量到底是如何存放的呢?

在这里,我就不卖关子了,直接给出如下结论,在没有#pragma pack宏的情况下:

 

原则1  结构(struct或联合union)的数据成员,第一个数据成员放在offset0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int32位机为4字节,则要从4的整数倍地址开始存储)。

原则2  结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

   *原则3  结构体作为成员时,结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct bb里有charintdouble等元素,那b应该从8的整数倍地址处开始存储,因为sizeof(double) = 8 bytes

 

这里,我们结合上面的程序来分析(暂时不讨论原则3)

先看看char_short_longlong_short_char这两个结构体,从它们的成员变量的地址可以看出来,这两个结构体符合原则1和原则2。注意,在 char_short_long的成员变量的地址中, char_short_long.s的地址是1244994,也就是说,1244993是“空的”,只是被“占位”了!

再看看char_long_short这个结构体,char_long_short的地址分布情况如下表:

 

成员变量

成员变量十六进制地址

成员变量十进制地址

char_long_short.c

0x0012FF2C

1244972

char_long_short.l

0x0012FF30

1244976

char_long_short.s

0x0012FF34

1244980

 

可见,其内存分布图如下,共12 bytes

地址

1244972

1244973

1244974

1244975

1244976

1244977

1244978

1244979

1244980

1244981

1244982

1244983

成员

.c

 

 

 

.l

.s

 

 

 

首先,1244972能被1整除,所以char_long_short.c放在1244972处没有问题(其实,就char型成员变量自身来说,其放在任何地址单元处都没有问题),根据原则1,在之后的1244973~1244975中都没有能被4(因为sizeof(long)=4bytes)整除的,1244976能被4整除,所以char_long_short.l应该放在1244976处,那么同理,最后一个.s(sizeof(short)=2 bytes)是应该放在1244980处。

是不是这样就结束了?不是,还有原则2。根据原则2的要求,char_long_short这个结构体所占的空间大小应该是其占内存空间最大的成员变量的大小的整数倍。如果我们到此就结束了,那么char_long_short所占的内存空间是1244972~1244981共计10bytes,不符合原则2,所以,必须在最后补齐2个 bytes(1244982~1244983)

至此,一个结构体的内存布局完成了。

下面我们按照上述原则,来验证这样的分析是不是正确。按上面的分析,地址单元124497312449741244975以及12449821244983都是空的(至少char_long_short未用到,只是“占位”了)。如果我们的分析是正确的,那么,定义这样一个结构体,其所占内存也应该是12 bytes

struct  //声明结构体char_long_short_new

{

     char  c;

     char  add1;  //补齐空间
         char  add2;  //补齐空间
         char  add3;  //补齐空间

 

     long  l;

     short s;

     
         char  add4;  //补齐空间
         char  add5;  //补齐空间

 

}char_long_short_new;

 

运行结果如下:


 

可见,我们的分析是正确的。至于原则3,大家可以自己编程验证,这里就不再讨论了。


    所以,无论你是在VC6.0还是Keil C51,还是Keil MDK中,当你需要定义一个结构体时,只要你稍微留心
结构体成员变量内存对齐这一现象,就可以在很大程度上节约MCURAM。这一点不仅仅应用于实际编程,在很多大型公司,比如IBM、微软、百度、华为的笔试和面试中,也是常见的。




test.c

2.37 KB, 下载次数: 815

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2014-8-25 08:45:03 | 显示全部楼层
如果这么问我,我肯定不会答。。。稍微有点偏重理论,如果说个问题用结构体的方法去解决应该没问题。说起来结构体的用法还是蛮多,技巧也很多,可以模仿着写一些面向对象思想的东西,例如:我经常用结构体来写菜单,重定义数据结构什么的,属于一次定义多次受用的那种。同时结合指针可以简化大量代码,使程序更加紧凑。

    for(i=0;i<16;i++)//根据通道复制通道01的数据
    {
          (*input[channel].c_data.data) = (*input[0].c_data.data);
     } 
这几行代码操作了4个通道,每个通道16个变量,也就是说根据条件可以自由操作64个变量。其中变量的定义是自由的,结构体通过指针引用过来,对处理多通道多数据,结构体不失为一个好方法。
回复 支持 3 反对 0

使用道具 举报

19

主题

107

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-3-5
在线时间
44 小时
发表于 2015-3-11 14:48:04 | 显示全部楼层

struct  //声明结构体char_long_short_new

{

     char  c;

     char  add1;  //补齐空间
         char  add2;  //补齐空间
         char  add3;  //补齐空间

 

     long  l;

     short s;

     
         char  add4;  //补齐空间
         char  add5;  //补齐空间

 

}char_long_short_new;

 

运行结果不一定是12吧,比如下表所示:
1   2   3   4    1   2   3   4    1   2   3   4    1   2   3   4    
.c ad1 ad2 ad3               l 要 占4    个   sz占两个 ad4 ad5

这样就要占16byte了吧

回复 支持 2 反对 0

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-2-21 23:23:34 | 显示全部楼层
回复【楼主位】shr5791:
---------------------------------
结论没问题,稍有偏颇,从编译结果逆推语法是不太合适的。
于20150522停用该账号:http://www.microstar.club
回复 支持 1 反对 0

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-2-21 23:39:08 | 显示全部楼层
顶,内存对齐,很实用
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-2-21 23:47:33 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-7-23
在线时间
3 小时
发表于 2014-2-22 00:12:53 | 显示全部楼层
学习了,RAM不是ARM,不过都应该能明白
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-2-22 10:28:07 | 显示全部楼层
顶,MARK
回复 支持 反对

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2014-2-22 10:49:17 | 显示全部楼层
回复【2楼】styleno1:
---------------------------------
呵呵,我并不是从代码推出结论。代码只是演示作用,便于大家理解。
回复 支持 反对

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2014-2-22 10:49:31 | 显示全部楼层
回复【3楼】745021926:
---------------------------------
是的
回复 支持 反对

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2014-2-22 10:49:54 | 显示全部楼层
回复【5楼】gampt:
---------------------------------
谢谢指正,我改过来了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-22 11:29:57 | 显示全部楼层
mark,学习了,正感受着它的威力呢
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2014-2-22 16:27:54 | 显示全部楼层
俺是来学习的,多谢分享
天道酬勤
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2013-12-22
在线时间
0 小时
发表于 2014-2-22 16:34:42 | 显示全部楼层
多谢,学习了
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-2-22 17:00:11 | 显示全部楼层
回复【7楼】shr5791:

回复【2楼】styleno1:
---------------------------------
呵呵,我并不是从代码退出结论。代码只是演示作用,便于大家理解。

---------------------------------
演示的很易懂。我所知的大概是酱紫:结构体成员的寻址方式:内部偏移地址+基地址,因而他俩地址都得对齐。
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2014-2-22 19:44:37 | 显示全部楼层
回复【13楼】styleno1:
---------------------------------
是的,是这样的,关键是内部偏移量偏移多少的事
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2014-2-22 22:47:51 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

头像被屏蔽

38

主题

382

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2012-12-5
在线时间
19 小时
发表于 2014-2-23 00:18:15 | 显示全部楼层
看了楼主的帖子受到鼓励,把自己程序中的好多#define的常量定义,按用途汇总成结构体的变量,
算是跨过一道坎。

个人体会学单片机一定要找兴趣点,有动力才行。遇到实际情况,才知道结构体的好处,才知道RTOS的好处。
回复 支持 反对

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2014-2-23 15:58:37 | 显示全部楼层
回复【16楼】toddchen:
---------------------------------
没错,说得很好
回复 支持 反对

使用道具 举报

8

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-7-27
在线时间
1 小时
发表于 2014-2-24 10:46:44 | 显示全部楼层
Thx ~
回复 支持 反对

使用道具 举报

7

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2013-4-9
在线时间
25 小时
发表于 2014-2-24 11:48:29 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
发表于 2014-2-25 08:58:24 | 显示全部楼层
多谢大神分享
避免犯错本是错误所在,我错故我在……
回复 支持 反对

使用道具 举报

6

主题

124

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-8-12
在线时间
0 小时
发表于 2014-3-1 19:23:49 | 显示全部楼层
 以前还真没注意过内存对齐,受教了
当你想到自己还一无所有的时候,请记得你还有梦想!
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2012-9-22
在线时间
3 小时
发表于 2014-3-13 00:24:13 | 显示全部楼层
不错的分析,受教了。
回复 支持 反对

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2014-3-13 18:15:44 | 显示全部楼层
在访问结构体的时候,切记,内存对齐的问题,,
回复 支持 反对

使用道具 举报

15

主题

204

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2013-7-17
在线时间
0 小时
发表于 2014-3-16 21:38:16 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

5

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-10-15
在线时间
107 小时
发表于 2014-3-26 13:47:56 | 显示全部楼层
原来结构体有这么多的学问,学习了
非知之难,行之惟难;非行之难,终之斯难
回复 支持 反对

使用道具 举报

56

主题

1237

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2642
金钱
2642
注册时间
2014-2-13
在线时间
518 小时
发表于 2014-3-26 15:03:00 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

20

主题

232

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2013-6-1
在线时间
0 小时
发表于 2014-3-26 16:42:31 | 显示全部楼层

-

回复 支持 反对

使用道具 举报

8

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2013-9-5
在线时间
31 小时
发表于 2014-3-27 07:48:38 | 显示全部楼层
学习记号备用
回复 支持 反对

使用道具 举报

11

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-11-11
在线时间
0 小时
发表于 2014-3-27 09:05:17 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-8-23
在线时间
0 小时
发表于 2014-8-23 20:53:24 | 显示全部楼层
这是以空间换时间的方法,顶
回复 支持 反对

使用道具 举报

56

主题

167

帖子

4

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2013-10-18
在线时间
59 小时
发表于 2014-8-24 08:01:08 | 显示全部楼层
好贴啊,就需要这样的帖子,虽然难度不大,但是能讲这么清除的,堪比大学老师了。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2014-8-23
在线时间
0 小时
发表于 2014-8-24 13:25:19 | 显示全部楼层
厉害,厉害,受教了。多谢楼主分享,感谢。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2014-7-31
在线时间
0 小时
发表于 2014-8-25 11:12:58 | 显示全部楼层
非常不错,谢谢分享~
回复 支持 反对

使用道具 举报

3

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2013-1-12
在线时间
27 小时
发表于 2014-8-25 20:28:57 | 显示全部楼层
谢谢分享,顶一个。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-12-15
在线时间
0 小时
发表于 2015-1-30 10:18:56 | 显示全部楼层
学习了 
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-10-26
在线时间
1 小时
发表于 2015-12-31 12:01:17 | 显示全部楼层
厉害啊
回复 支持 反对

使用道具 举报

0

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
金钱
326
注册时间
2014-8-15
在线时间
89 小时
发表于 2016-1-20 21:59:04 | 显示全部楼层
tks                        
回复 支持 反对

使用道具 举报

11

主题

115

帖子

0

精华

高级会员

Rank: 4

积分
742
金钱
742
注册时间
2016-1-20
在线时间
189 小时
发表于 2016-1-21 14:42:43 | 显示全部楼层
阿拓 发表于 2015-3-11 14:48
struct &nbsp;//声明结构体char_long_short_new

这个违反原则3
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2015-6-23
在线时间
112 小时
发表于 2016-1-21 21:51:38 | 显示全部楼层
很受用,以后要领会解决问题的思路。
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2016-1-23 20:55:16 | 显示全部楼层
xiexiele ...
回复 支持 反对

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-2-25 22:51:43 | 显示全部楼层
OPENEDV确实能人多啊, 通俗易懂,比谭浩强的书好 !
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-6-15
在线时间
32 小时
发表于 2016-2-26 08:50:31 | 显示全部楼层
mark!谢谢
回复 支持 反对

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-26 17:41:10 | 显示全部楼层
标记,慢慢学习
我有故事,你有酒吗
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2016-2-26 22:29:53 | 显示全部楼层
感谢分享111111111
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-29 09:53:16 | 显示全部楼层
本帖最后由 来俩不甜的 于 2016-2-29 09:56 编辑

请问这个。c能不能在1249975地址呢,如果能的话 这个结构体的长度不就少3个字节了吗?再根据原则2 如果要补齐的话是不是从后边补呢?

可见,其内存分布图如下,共12 bytes:
地址
1244972 1244973 1244974 1244975 1244976 1244977 1244978 1244979 1244980 1244981 1244982 1244983
成员
.c                                               .l                                                  .s


我有故事,你有酒吗
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-26
在线时间
11 小时
发表于 2016-2-29 18:32:40 | 显示全部楼层

原来结构体有这么多的学问,学习了
回复 支持 反对

使用道具 举报

16

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2015-11-1
在线时间
34 小时
发表于 2016-2-29 23:14:31 | 显示全部楼层
不错不错
回复 支持 反对

使用道具 举报

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-6-10
在线时间
7 小时
发表于 2016-3-1 10:03:05 | 显示全部楼层
好东西,受教了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 10:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表