华为技术有限公司C语言编程基础

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
基础篇之字节对齐
案例点评

在定义数据结构时(尤其是涉及协议和IPC通讯的时候),没有 特殊理由的话,都定义成四字节对齐;这样做可能浪费几个字节, 但是不会出问题;

除了数据结构总长度是四字节对齐外,每一个部分也要保证它是 四字节对齐的(可以按照四字节、两字节、一字节的顺序排放数 据结构中的各个域);
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
我们要Leabharlann Baidu什么?
struct XXX { char cA; short sB; long lC; };
void main() { char *pChar;
pChar = (char *)malloc(7); memcpy(pChar, "abcdefgh", sizeof(XXX)); printf("%s\n", pChar); }
目录
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 前言 sizeof 字节对齐 字节序 函数参数 返回值 强制类型转换 Switch case 字符串 溢出 资源释放 If规范 临界资源保护 简单既是美
Huawei Confidential
HUAWEI TECHNOLOGIES CO., LTD.
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
基础篇之字节对齐
数据结构内部对齐,下面2种定义哪个好? typedef struct example { USHORT usA; ULONG ulA; USHORT usB; UCHAR ucA; USHORT usC; } EXAMPLE_S VS typedef struct example { ULONG ulA; USHORT usA; USHORT usB; USHORT usC; UCHAR ucA; UCHAR ucReserved; } EXAMPLE_S

对于无法定义成四字节对齐的数据结构,如以太网II、HDLC等,
则将它们强行定义成一字节对齐,以规避这个问题;

对于MIPS CPU,在必须面对非四字节对齐情况时,采用编译选
项方式加以解决;
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
目录
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 前言 sizeof 字节对齐 字节序 函数参数 返回值 强制类型转换 Switch case 字符串 溢出 资源释放 If规范 临界资源保护 简单既是美
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
基础篇之简单就是美
编码的三不原则 不要挑战自己的记性 不要挑战同事的耐心 不要挑战编译器的水平 编码的三用原则 能用简单语句的,就不要用复杂的技巧 能用成熟代码的,就不要再来一套 能用上工具的,就一定要机械化

缺省情况下,编译器自动对数据结构进行四字节对齐,以提高程序执行
的效率,在特殊情况下,可以通过预编译指定指定数据结构为1字节对齐 或者其他; 对于Power PC/Intel系列CPU,在非四字节对齐情况下,由CPU自动完 成两次操作,对上层应用透明;对于MIPS CPU,则需要通过编译选项进 行干预,或者调整数据结果避免出现这种情况,否则会产生例外; 字节对齐对数据结构的尺寸(sizeof)直接产生影响
Huawei Confidential
HUAWEI TECHNOLOGIES CO., LTD.
目录
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 前言 sizeof 字节对齐 字节序 函数参数 返回值 强制类型转换 Switch case 字符串 溢出 资源释放 If规范 临界资源保护 简单既是美
Huawei Confidential
HUAWEI TECHNOLOGIES CO., LTD.
基础篇之字节对齐

随着半导体技术的发展,我们经历8bit、16bit、32bit乃至64bit的CPU,
我们产品当前大多使用32bit CPU

从内存存取效率来说,4字节对齐的存取速度是最快的,非对齐情况下, CPU需要分解成两次32bit操作;
Huawei Confidential
HUAWEI TECHNOLOGIES CO., LTD.
前言
提高我司产品竞争力,研发要在以下几个方面下功夫: 提高规划水平,把握正确的方向(战略)


提高设计水平,搭建合理的系统(战术)
提高编码水平,开发稳定的代码(单兵作战技能)

HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
前言

我们为什么要进行培训? 最好的医术是预防


真正的难问题往往是低级错误引起的
我们的编码水平不容乐观 C是程序员的语言


HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
前言

要提高编码水平,每个开发人员要做到:
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
基础篇之字节对齐
#pragma pack(push) #pragma pack(1) typedef struct Head { CHAR src [6]; ULONG ulType; } HEAD_S; #pragma pack(pop) VOID Encapsulation(CHAR* pBuf) { ULONG ulLen, ulDestIP; CHAR* pData = pBuf; ulLen = sizeof(HEAD_S); pData += len; ulDestIP = VOS_NTOHL((IP_S *)pData->ulDestIP); (MIPS CPU 异常) return; }
Sizeof(stMax/pMax/str/pChar/ulGrade/usClass/dWeight/pCharArray)的 取值分别是多少?
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
基础篇之sizeof
typedef union record { LONG lIndex; SHORT sLevel[6]; CHAR cPos; } REC_S; REC_S CHAR CHAR ULONG USHORT DOUBLE UCHAR stMax(12),*pMax(4); str[] = “Hello”(5+1=6,不要忘了\0) ; *pChar = str (4); ulGrade = 10(4); usClass = 10(2); dWeight(8); *pCharArray[10][10](4×10×10=400);
return;
Huawei Confidential
HUAWEI TECHNOLOGIES CO., LTD.
我们要求什么?-续
struct XXX { char cA; short sB; long lC; }; void main() { char *pChar; pChar = (char *)malloc(7); /*0,魔鬼数字; 1,未申请成功怎么办?*/
Huawei Confidential
HUAWEI TECHNOLOGIES CO., LTD.
基础篇之简单就是美
If (a && b || c | d == e & f) 这个表达式的正确运算顺序是什么? test(a++, ++a, a++, ++a, a++, ++a) a = 1; 实际函数调用时,传入的参数值分别是多少?
勤学苦练,提高编程技能


前车之鉴,后世之师,不犯同样的错误;
坚持代码Review、PC-LINT检查和单元测试;


总而言之,就是少犯错误,尽早发现错误
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
目录
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 前言 sizeof 字节对齐 字节序 函数参数 返回值 强制类型转换 Switch case 字符串 溢出 资源释放 If规范 临界资源保护 简单既是美
基础篇之sizeof

数据结构是C语言的基础 C语言的灵活性很大程度上在于其数据结构的灵活性


要用好数据结构,首先要掌握数据结构大小的计算
系统为每个数据结构、每个变量都会分配一个对应的存储空间,

这个存储空间的大小就是数据结构的尺寸
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
基础篇之sizeof
typedef union record { LONG lIndex; SHORT sLevel[6]; CHAR cPos; } REC_S; REC_S CHAR CHAR ULONG USHORT DOUBLE UCHAR stMax,*pMax; str[] = “Hello” ; *pChar = str ; ulGrade = 10; usClass = 10; dWeight *pCharArray[10][10];
(++*p++) – (--*q--)语义是什么?
a= b=1,c=2,d=3; e=4; a的值是多少?
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
基础篇之简单就是美
这里没有答案,只有问题:
我们问什么要写这样的代码?
工作太轻松? BUG不够多? 水平显不出? ………… 如何改进? 优先级搞不清楚用括号; 复合语句太罗嗦,拆成几行来写; 套用两句广告词: 把简单的事情复杂化,太累 把复杂的事情简单化,贡献!
Huawei Confidential


HUAWEI TECHNOLOGIES CO., LTD.
基础篇之字节对齐
typedef struct Head { CHAR src [6]; ULONG ulType; } HEAD_S;
VOID Encapsulation(CHAR* pBuf) { ULONG ulLen, ulDestIP; CHAR* pData = pBuf; ulLen = sizeof(HEAD_S); pData += ulLen; ulDestIP = VOS_NTOHL((IP_S *)pData->ulDestIP); return; }
Security Level:内部公开
华为技术有限公司 C语言编程基础
www.huawei.com
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
目录
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 前言 sizeof 字节对齐 字节序 函数参数 返回值 强制类型转换 Switch case 字符串 溢出 资源释放 If规范 临界资源保护 简单既是美
memcpy(pChar, “abcdefgh”, sizeof(XXX)); /*2,内存越界*/
printf(“%s\n”, pChar); /*3,没有字符串结束符*/ } return; /*4,没有释放内存*/
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
Huawei Confidential
HUAWEI TECHNOLOGIES CO., LTD.
基础篇之字节序
X86系统: VOID QosConfigPolicy() { ulDestIP = 从命令行读取用户配置的参数; pQosPolicy->ulDestIP = ulDestIP; return; } 主机处理: VOID QosClassify() { pIp = (IP_S *)pData; if (pIp->ulDestIp == pQosPolicy->ulDestIP) { DoSomething(); } return ; }
相关文档
最新文档