2018-07-02

495-51-60

51.如何向接受结构参数的函数传入常量值?怎样创建无名的中间的常量的结构值?

答:传统的C语言没有办法生成匿名的结构值。你必须使用临时结构或一个小的结构生成函数。

C99标准引入了“复合字面量”,复合字面量的一种形式就可以允许结构常量。例如,向假定的plotpoint函数传入一个坐标对常量,可以调用

plotpoint ((struct point)(1, 2));

与“指定初始值”结合,也可以用成员名称确定成员值:

plotpoint ((struct point)(x = 1, y = 2));

52.怎样从/向数据文件读/写结构

答:用fwrite()编写一个结构相对简单:

fwrite(&somestruct, sizeof somestruct, 1, fp);

对应的fread调用可以再把它读回来,此处fwrite收到一个结构的指针并把这个结构的内存映像作为字节流写入文件(或在对应的fread的时候读入)。sizeof操作符计算出结构占用的字节数。

只要范围内有fwrite的原型(通常只需包含<STDIO.H>),那么ANSI编译器下这样调用fwrite就是正确的,在ANSI之前的编译器中,需要对第一个参数进行类型转换:

fwrite((char *)somestruct, sizeof somestruct, 1, fp);

重要的是fwrite接受字节指针,而不是结构指针。

但是这样用内存映像写出的书奴文件却不能移植,尤其是当结构中包含浮点成员或指针的时候,结构的内存布局跟机器和编译器都有关,不同的编译器可能使用不同数量的填充位,不同机器上基本类型的大小和字节顺序也不尽相同,因此,作为内存映像写出的结构在别的机器上(甚至是被别的编译器编译后)不一定能被读回来,当你需要在不同的机器上交换数据文件的时候,尤其要注意。

53.结构充填

为什么我的编译器在结构中留下了空洞?这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉充填,或者控制结构域的对齐方式?

答:当内存中的值合理对齐时,很多机器都能非常高效地访问。例如,在按字节寻址的机器中,2字节的short int型变量必须放在偶地址上,而4字节的long int型变量则必须存放在4的整数倍地址上。某些机器甚至根本就不能访问没有对齐的地址,因此必须要求所有的数据都正确地对齐

假如你声明了这个结构:

struct
{
    char c;
    int i;
};

编译器通常都会在char和int之间留出一个没有命名也没有使用的空洞,以确保int型域正确对齐。(根据最保守的对齐要求,结构本身也是对齐的,因此第二个域可以根据第一个域的位置进行累进对齐,编译器保证它所分配的结构对齐,对malloc也是如此)

编译器可能提供某种扩展用于控制结构的填充

如果你真的那么在意被浪费的空间,可以把结构中的域按从大到小的顺序排列,以最大限度地降低充填的影响,数组成员应该根据它的元素类型大小而不是整个数组的大小进行排序的时候,使用位域也可以很好地控制大小和对齐,但是这样也有它的缺点。

3.为什么sizeof返回的值大于结构大小的期望值,是不是尾部有充填

答:为了确保分配连续的结构数组时正确对齐,结构可能有这种尾部

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 丑数 第一个只出现一次的字符位置这题也简单,使用整数数组的值是否等于1判断是否有重复值。有个有意思的地方是初始化数...
    hayes0420阅读 90评论 0 0
  • # XML复习 ## 第一章 ## 思考题 **什么是XML?** XML是可扩展性标记语言,XML是标准通用标记...
    冷漠铁锤丁富贵阅读 794评论 0 0
  • 计算机系统概论: 计算机系统由软件和硬件两大部分组成,软件又分为系统软件和应用软件。 浮点数范围大,定点...
    Sallyscript阅读 1,507评论 0 1
  • C语言 第一章 入门1.1 hello,world学习一门新程序设计语言的唯一途径就是使用它编写程序。对于所有初学...
    Thinkerboy阅读 161评论 0 0
  • 一捧米豆的树阅读 251评论 0 1