"); //-->
1.printf的输出问题
printf("%d",total);//this is right
printf(total);//this is wrong
printf("hello");//but this is right
2.整数类型的长度
char 1个子节,8位
unsigned short [int]
[signed] short int
short 2个字节,16位
[signed] int
unsigned int
int 型在vc里是4个子节,32位,也可能是16位,2个字节
long [int]
unsigned long [int]
long型都是32位,4个字节
float 32 ,4
double 64,8
long double 128,16
char 8,一个字节,存放的实际上是字符的ascii码
3、找出错误并改正
char *my_cpy(char* src, int len){
char dest[1024];
memcpy(dest, src, len);
return dest;
}
上面的函数是否有问题,如果有指出其所在,如果没有,给出函数功能描述。
答案:
1。数组应该初始化
2。memcpy不判断是否越界,所以调用前应该判断是否越界
3。不应该返回rest,因为这个数组是在函数内部申请的,所以函数结束之后就会消失,指针也会变成“野指针”,所以指向非法地址
最后一个比较隐蔽
char *memcpy( char *dest, const char *src,int len )
{
char* pDest = (char*)dest;
char* pSrc = (char*)src;
int pos;
for(pos=0;pos<len;pos++)
{
pDest[pos] = pSrc[pos];
}
return (char*)pDest;
}
存在地问题就是没有判断指针是否非法assert(dest !=NULL || src != NULL); 条件为 FLASE 显示
不调用其他函数,写一个memcpy的函数,函数原型为
void *memcpy(void *dest, void *src, size_t length);
-----------利用好断言---------
/* memcpy ─── 拷贝不重叠的内存块 */
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
void* pbTo = (byte*)pvTo;
void* pbFrom = (byte*)pvFrom;
ASSERT(pvTo != NULL && pvFrom != NULL);
/* 内存块重叠吗?如果重叠,就使用memmove */
ASSERT(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
while(size-->0)
*pbTo++ == *pbFrom++;
return(pvTo);
}
-----------------------
常见函数编程:
char *strcpy(char *strDest, const char *strSrc)
{
ASSERT(strDest != NULL && strSrc != NULL);
char *addr = strDest;
while(*strDest++=*strSrc++)
NULL; //NULL可以省略,但更有利于编译器发现错误
}
return addr;
}
void *memcpy(void *dest, const void *src, int count)
{
ASSERT(dest!= NULL && src!= NULL);
for(int i=0; i< cout; i++)
{
dest = src;
}
}
int strcmp(const char*str1, const char *str2)
{
while (str1 != NULL && str2 != NULL)
{
if(*str1 < *str2) return -1;
else if(*str1 > *str2) return 1;
else { str1++; str2++;}
}
if(str1 == NULL && str2 != NULL)
return -1;
else if(str1 != NULL && str2 == NULL)
return 1;
else return 0;
}
//way2: more compact
int strcmp(const char*str1, const char *str2)
{
int i = strlen( str1 );
int j;
for(j=0; j<=i; j++)
{
if(str1[j] > str2[j]) return 1; //if str2 terminates, then str2[j]=0, str1[j]>str2[j], return 1;
else if(str1[j] < str2[j]) return -1;
else if(str1[j] == '') return 0;
}
}
//way3: optimize again.
int strcmp(const char * str1, const char * str2 )
{
while(1)
{
if(*str1 > *str2) return 1;
else if(*str1 < *str2) return -1;
else if(*str1 == '') return 0;
str1++;str2++;
}
}
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
LTspice中的随机数是真随机数吗?
555可编程快速充电器电路
光接口模块市场动向
在PROTEL 99 SE中增加工作层的方法
整合性混合讯号解決方案
嵌入式Linux性能监控和调优 上
分孔图做钻带文件的方法
DSL降价会危及有线电视的优势吗?
国家超算互联网核心节点上线试运行,托举中国AI算力应用关键一跃!
嵌入式Linux性能监控和调优 下
利用GMSL打造高性能机器人视觉
具有保护功能、适用于过程控制模拟输出的精密、稳健解决方案
555感性开关式电源电路
在Allegro中如何输入原理图的网表文件?
555正电压源变换为-5v电源电路
搞定功耗和空间,可靠又紧凑的隔离模拟输出模块
555经济型荧光显示灯丝电压源电路
如何使用LDO的VIOC特性来降低噪声、优化功耗?
技术干货|德州仪器 Sitara 产品系列赋能工业网络升级,引领更智能的工业互联
元件布局
路透社:英特尔、AMD 告知中国客户 CPU 供货需漫长等待
555脉冲调宽式开关电源电路
源来如此 | ESS 中的双向 CLLLC 谐振转换器的控制方案
FPGA在视频处理领域的应用 下
嵌入式Linux图形界面开发 下
历史上的今天:5月17日
对比台积电,溯源英特尔制造工艺落后与代工业务困境
《智慧书》6
局内人谈我国水下机器人的真实水平
FPGA在视频处理领域的应用 上