往期文章:
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规范编辑笔记分享我们就到这里了,我们第十四篇(最后一篇)见~
本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~