1.【OJ】设计一个函数sum(n)=1+2+...+n,假设sum(n)不超过整型数表示范围。
错误解法:
int sum(n){
int ans;
ans = n*(n+1)/2;
return ans;
}
错误在于:n*(n+1)时可能已经超出了整型数的表示范围,造成溢出错误。
int sum(n){
if(n%2)
return (n+1)/2*n;
else
return n/2*(n+1);
}
2.【美图】请写出下面程序的运行结果。
void func(void){
char *dst;
dst = (char*)malloc(sizeof(char)*1024);
strcpy(dst, "Hello");
free(dst);
if(dst!=NULL){
strcpy(dst, "World");
}
printf("%s", dst);
}
易错之处:
①free后只是将堆空间交还给系统,并不对指针变量dst和dst所指向的内存空间内容进行修改;
②free后的dst指针是野指针,如果系统在free后占用dst所指空间,那么对dst的操作将产生错误,如果系统并没占用dst所指空间,操作是成功的,但是隐患很大。
所以上面代码运行结果可能为:程序出错,非法访问内存;输出World字样。
3.【美图】请指出下面程序的错误。
char* func(char *s, int len){
char dst[1024];
memcpy(dst, s, len);
return dst;
}
易错之处:
①memcpy与strcpy不同,memcpy严格按照指定参数len来复制字节数,所以这里可能会遗漏'\0'字符串结束符,导致错误;
②dst为局部变量,当函数返回时,dst所指向的1024个字节空间将被释放(退栈),所返回的dst指针指向的内容会被其他内容所覆盖,所以返回的dst是无用的。