读《微软c编程精粹》

2013/12/10
读《微软c编程精粹》
变量指针的命名:
基本采用匈牙利式的命名规则,所有字符型的变量均以ch开始
字节型的变量均以b开头,长字节均以l开头,对于指向某些数据类型
的指针
byter b,char ch,long l;
char *pch指向ch的指正是以P开始,byter *pb,指向b的指针是以P快开始
long *pl 指向l指针是以P开始。void* pv特意显用的空指针,
char **ppch,指向字符指针的指针。byter **ppb指向字节指针的指针。
一 假想自己需要编译的程序

C程序中的算法错误
-> line 42: int itoa(int i, char* str)
algorithm error: itoa fails when i is -32768
传递参数错误line 318: strCopy = memcpy(malloc(length), str, length);
Invalid argument: memcpy fails when malloc returns NULL
关于while 的经典错误
void* memcpy(void* pvTo, void* pvFrom, size_t size)
{
byte* pbTo = (byte*)pvTo;
byte* pbFrom = (byte*)pvFrom;
while(size-->0);//此处多余一个分号但是编译器会默认正确,
但是这是个空循环,只是可能警告会有错误,
*pbTo++ = *pbFrom++;
return(pvTo);
}
可以改为一下程序:
char* strcpy(char* pchTo, char* pchFrom)
{
char* pchStart = pchTo;
while((*pchTo++ = *pchFrom++)!='\0')
NULL;//此处加上NULL所以虽然如实但是是个空语句。进而会更加提高程序的质量。
Return(pchStart);
}
此外我们可以设置警告措施。利用这一警告。

1)while( ch = ( getchar() != EOF ) )怎么查出?
编译程序会查获优先顺序错。因为它把表达式解释为:
while( ch = ( getchar() != EOF ) )
换句话说,编译程序把它看作是将表达式的值赋给ch,因而认为你把“==”错误的键
为“=”,并向你发出可能有复制错误的警告。
2)a) if(flight == 063)。这里程序员的本意是对63 号航班进行测试,但因为前面
多了一个0 使063 成了八进制数。结果变成对51 号航班进行测试。
查获偶然“八进制”的最简单的方法是扔掉开关,这个开关导致编译程序在偶人
得到八进制的常量时出错,取而代之的是十进制和十六进制。


b) If(pb != NULL & pb != 0xff)。这里不小心把&&键入为&,结果即使pb 等于
NULL 还会执行*pb != 0xff。
如果将&&误写为&编译器会发现和==写为=的同意错误。查找办法也是同上。


c) quot = numer/*pdenom。这里无意间多了个*号结果使/*被解释为注释的开始。

这个错误是/*会被误以为是注释符号。要改变是可以这么改(quot=number/ *pdenom)
或者可以加个括号quot=number/(*pddenom);
d) word = bHigh<<8 + bLow。由于出现了运算优先级错误,该语句被解释成了:
word = bHigh << (8+bLow
要是改变这句话的执行顺序,可以这么word=(bHigh<<8)+bLow;
如果没有这括号会变化执行顺序产生警告,word=bHigh<<(blow+8);


二.memcopy出现的错误
strCopy=memcpy(malloc(length),str,length);

这句话在大多数情况下,除非malloc调用失败,就会给memcpy返回有一个NULL
指针,但是由于memcpy处理不了NULL指针,
void memcpy(void *pyTo,void *pvForm,size_t size)
{
void *pbTo=(byter *)pvTo;
void *pbFrom=(byter*)pvFrom;
if(pvTo==NULL||pvFrom==NULL)
{
fprintf(sterr,"bad args is memcpy\n");
}

while(size-->0)
*pbTo++=*ptFrom++;
renturn (pvTo);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值