1.不要使用output memory作为函数内使用的buffer,要使用内部buffer,然后cpy出去
错误实例:
void UnsToStr(unsigned u,char *str)
{
char *pch;
/* u超出范围吗?使用UlongToStr… */
ASSERT(u<= 65536);
/* 将每一位数字自后向前存储
* 字符串足够大以便能存储u的最大可能值
*/
pch = &str[5];
*pch = ‘/0’;
do
*--pch = u%10 + ‘0’;
while((u/=10)>0);
// strcpy(str,pch);
}
正确
void UnsToStr(unsigned u,char *str)
{
char strDigits[6];
char *pch;
/* u超出范围了吗?使用UlongToStr… */
ASSERT(u <= 65536);
pch = &strDigits[6];
*pch = ‘/0’;
do
*--pch = u % 10 + ‘0’;
while((u/=10)>0);
strcpy(str,pch);
}
2.不要编写寄生函数,不要编写依赖于另一个函数内在实现的函数
错误实例
/* FILL 填充某一存储域 */
void Memset(byte *pb,size_t size,byte b)
{
if(size>0)
{
*pb = b;
memcpy(pb,pb+1,size-1);
}
}
这样的程序对于RAM没错,但对于 memoryI/o(机械手)ROM,就不对了
本文指出在函数中直接使用外部buffer可能导致的问题,并提供正确的解决方案。同时警告开发者不要编写依赖其他函数内部实现的代码,以避免不可预知的错误。
1327

被折叠的 条评论
为什么被折叠?



