C规范编辑笔记(十三)

2023-11-15

往期文章:

C规范编辑笔记(一)
C规范编辑笔记(二)
C规范编辑笔记(三)
C规范编辑笔记(四)
C规范编辑笔记(五)
C规范编辑笔记(六)
C规范编辑笔记(七)
C规范编辑笔记(八)
C规范编辑笔记(九)
C规则编辑笔记(十)
C规范编辑笔记(十一)
C规范编辑笔记(十二)

正文:

今天,我们来更新C规范编辑笔记的第十三篇,可能最近有小伙伴发现我的更新速度变快了,哈哈,最主要是因为这些笔记前期就做好了,只是一直没有在csdn上面写,加上最近放假了,索性就一天更一篇吧,另外我们依然保持每一篇以短内容为主,防止长篇大论造成一定的疲劳。

好了,话不多说,直接来讲~

1、 sizeof 运算符返回的不是对象的大小,而是内存中使用的大小。案例如下:

typedef struct s_example {
    uint32_t ui_field1;
    uint8_t ui_field2;
} t_example;


int32_t isize = sizeof(t_example); /*  对于 32 位对齐,sizeof 返回的值为 8 ,所以sizeof返回的是内存中使用的大小*/

而使用了#pragma pack(push , 1) /* 1 字节对齐 - 非标准 */
isize = sizeof(t_example); /*sizeof 返回的值为 5,因为该结构是使用 1 字节对齐声明的*/

2、 规则 - 建议对内存分配是否成功进行强制验证。比如如下案例:

Bad example:
point_t *p_point;
p_point = (point_t *)malloc(sizeof(point_t));
/* 没有检查函数返回 */
p_point ->x = 0.0f;
p_point ->y = 0.0f;


Good example:

point_t *p_point = NULL;
p_point = (point_T *)malloc(sizeof(point_t));
if (NULL != p_point)  /*这里对p_point是否为空指针做了判断*/
{
    p_point ->x = 0.0f;
    p_point ->y = 0.0f;
} else {
    /* 内存分配没有成功的错误处理 */
}在这里插入代码片

***另外有必要将内存区域与其用途相关联:表示不同值的数据存储在单独的内存空间中。如果共享内存区域被回收,请确保在重新使用之前将其擦除。 一旦程序不再需要访问这些数据,就必须明确删除所有包含敏感数据的内存区域。

3、规则–在执行任何更改其值的标准库函数之前和之后初始化并查看 errno 的值

errno错误代码: 记录系统的最后一次错误代码。
!!! 只有当一个库函数失败时,errno才会被设置。当函数成功运行时,errno的值不会被修改。这意味着我们不能通过测试errno的值来判断是否有错误存在。反之,只有当被调用的函数提示有错误发生时检查errno的值才有意义。

因此,部分库函数会将错误结果存储在error中。具体应用代码对比如下:

Bad example:
#include <stdlib.h>
void try1 (const unsigned char * len)
{
    unsigned long res;
    res = strtoul(len,NULL ,5); /* 将字符串转换为 unsigned long */
    /* 函数 strtoul 写入 errno */
    if (res == ULONG_MAX)
    {
        /* 问题管理 */
    }
    ...
}

Good example:
#include <stdlib.h>
#include <errno.h>
void try1 (const unsigned char * len)
{
    unsigned long res;
    errno = 0; /* init errno */
    res = strtoul(len,NULL ,5); /* 将字符串转换为 unsigned long */
    /* 用 errno 写的 strtoul */
    if (res == ULONG_MAX && errno != 0) /* 错误阅读 */
    {
        /* 问题管理 */
    }
    ...
}

***另外C语言中有专门的错误代码(0-127)来表示不同的错误类型。

好了,第十三篇C规范编辑笔记分享我们就到这里了,我们第十四篇(最后一篇)见~

在这里插入图片描述

本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C规范编辑笔记(十三) 的相关文章

随机推荐

  • 机器学习——L1范数充当正则项,让模型获得稀疏解,解决过拟合问题

    问 使用L2范数正则项比L1范数正则项得到的是更为稀疏的解 答 错误 L1范数正则项得到的是更稀疏的解 因为在L1正则项中 惩罚项是每个参数绝对值之和 而在L2正则项中 惩罚项是每个参数平方的和 L1正则项可以压缩参数中的小值 更容易导致一
  • MongoDB wiredTiger存储引擎下的存储方式LSM和B-Tree比较

    前段时间做拦截件监控的时候把拦截件生命期存入mongodb 因生命期有各种变化 因此对此表的更新写操作非常多 老大给我看了一篇文章 才知道mongodb已经支持lsm存储方式了 原文如连接 https github com wiredtig
  • MongoDB安装时无法启动服务

    在安装MongoDB数据库的时候 有可能出现安装速度较慢 然后取消安装以后 再一次重新去安装的时候 在安装的最后一步可能会出现无法启动服务的现象 这种情况直接点击Ignore 完成安装以后 打开DOS窗口 使用该命令将MongDB服务删除掉
  • Qt UI 入门之QPushbutton

    Qt UI 入门之QPushbutton QPushbutton
  • 邻接表图,增加、删除、修改,功能齐全,有双权和有单权

    刚刚考完 纪念一下 虽说不是考试提交的最终代码 但是是我提前准备的考试源码 供给考试使用 这是单权 下面是双权的 include
  • linux jobs命令

    原文链接 http blog 163 com a7701 126 blog static 20821732201276231717 fg bg jobs ctrl z都是跟系统任务有关的 虽然现在基本上不怎么需要用到这些命令 但学会了也是很
  • AtCoder Beginner Contest 313

    A To Be Saikyo atcoder jp AC代码 include
  • Android EventBus收不到消息事件?又给自己挖坑了吧

    骚年 老给自己挖坑 该扇嘴巴子了 检查一下看是不是以下几种情况 没有register事件 事件类没对上号 比如导错包 接收事件的方法不是public 事件被优先级更高的拦截且中断了
  • 怎么将webm文件转换成MP4格式在手机上播放

    由于各品 不同型号的手机配置不同 手机支持的视频格式也可能不同 比较常见的就是视频格式转换 即将手机不支持播放的格式视频转换成手机支持的格式视频 手机最常用的格式是MP4 3GP 3G2等格式 所以我们只需将在电脑上下载的视频转换成这些适合
  • 想用Python做副业?看这一篇就够了

    大家好 我是耿直 随着人工智能 大数据 物联网的广泛应用 与之紧密关联的Python技术开始受到人们的极大关注 各行业对Python技术服务的需求量呈指数级暴增 尤以爬虫技术服务为甚 供不应求早已成为常态 而近两年受到各种不可抗力的影响 做
  • Linux(Centos7) 运行脚本程序,终端只返回 “已杀死”

    最近在实验室服务器上跑代码 没跑多久就显示 已杀死 而且只显示已杀死 没有任何其他打印和日志 1 确定不是代码的bug 2 网上搜了一大堆 全说是OOM的问题 就是代码消耗内存太多 被OOM killer杀死 但是我用的服务器内存确定充足
  • 百度地图marker点击切换icon以及上一个icon恢复原样

    var preMarker this map addEventListener click function e console log e if e overlay e overlay toString object Marker var
  • openresty+lua安装

    一 下载软件 下载ngx openresty xxx tar gz并解压 wget https openresty org download ngx openresty 1 9 7 1 tar gz ngx openresty xxx bu
  • 将包含children的数据解析构成iview的cascader或者树行需要的结构

    function convertTree rst const result 遍历 tree rst forEach item gt 解构赋值 let value value label label children children ite
  • 使用VS Code开发Arduino

    文章目录 目的 软件安装 快速使用 更多说明 编译输出时中文乱码 Arduino扩展配置说明 使用 arduino cli 总结 目的 Arduino官方的IDE作为编辑器的功能挺简陋的 用起来并不是很舒服 相比较之下用VS Code Vi
  • 面试官:说说TCP如何实现可靠传输

    今天来讲一下TCP是如何保证可靠传输的 这也是面试常问的一个题目 这个问题不单止能看出你是否真的了解TCP原理 更看出你是否有一个总结的能力 我们从三个部分来讲TCP是如何实现可靠传输的 滑动窗口 首先是讲TCP中的滑动窗口 它和TCP的可
  • 论文阅读: GeoNet: Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose(CVPR2018)

    CVPR2018 GeoNet Unsupervised Learning of Dense Depth Optical Flow and Camera Pose 提出了一个联合估计深度 光流和pose的网络 这是在left right c
  • Javascript设计模式-04-工厂模式

    Javascript设计模式 04 工厂模式 简单工厂 抽象工厂 简介 工厂模式定义一个用于创建对象的接口 这个接口由子类决定实例化哪一个类 该模式使一个类的实例化延迟到了子类 而子类可以重写接口方法以便创建的时候指定自己的对象类型 个人理
  • webview跳转第三方APP

    hello 又是我鑫鑫 前言 这吃给大家带来的博客是关于webview跳转第三方APP的 相信这个问题也为难过各位 那么话不多说 我直接上代码 MainActivity java 这里的活动名我没有改 使用的话 将所有的Contact Cu
  • C规范编辑笔记(十三)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 C规范编辑笔记 四 C规范编辑笔记 五 C规范编辑笔记 六 C规范编辑笔记 七 C规范编辑笔记 八 C规范编辑笔记 九 C规则编辑笔记 十 C规范编辑笔记 十一 C规范编