C专家编程学习笔记——第五、六、七章:对编译器和系统底层的思考

      C专家编程的这三章都是关于程序编译、链接、运行的内部机制以及对操作系统底层的和存储器的一些分析。

      第五章:对链接的思考 分析了不同链接方式如静态链接、动态链接和共享链接的不同,接着分析了类unix系统中链接的一些情况,最后介绍了查看“连接器报告文件”的方法。

      第六章:运行时数据结构 分析了程序在运行时的情况,包括数据段、文本段的划分和映射关系;分析了堆栈的使用以及“函数调用”过程的实现;之后又介绍了 setjmp() 和 longjmp() 的用途。在本章最后,作者列举了一下C语言工具主要是类Unix系统中的。

      第七章:对内存的思考 和操作系统有重叠,主要讲了对存储器的访问等。本章最后关于“段错误”的讨论我在此做了摘录:

      通常导致段错误的几个直接原因:
            ● 解除引用一个包含非法值的指针。
            ● 解除引用一个空指针(通常由于从系统程序中返回空指针,并未检查就使用)
            ● 在未得到正确的权限时进行访问。例如,试图往一个只读的文本段存储值就会引起段错误
            ● 用完了堆栈或堆空间(虚拟内存虽然很巨大但绝非无限)

      以发生频率为序,最终可能导致段错误的常见编程错误是:
             ⒈ 坏指针值错误:在指针赋值之前就用它来引用内存,或者向库函数传送一个坏指针。还有,对指针进行释放之后再访问它的内容。可以修改 free 语句,在指针释放之后再将它置为空值。
             free( p );    p = NULL;
              这样,如果在指针释放之后继续使用该指针,至少程序能在终止之前进行信息转储。

              ⒉ 改写错误:越过数组边界写入数据,在动态分配的内存两端之外写入数据,或改写一些堆管理数据结构。
              p = malloc(256);      p[ –1 ] = 0;         p[ 256 ] = 0;

              ⒊ 指针释放引起的错误:释放同一块内存两次,或释放一个未曾使用malloc 分配的内存,或释放仍在使用中的内存,或释放一个无效的指针。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值