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所指向的内存空间内容进行修改;code
②free后的dst指针是野指针,若是系统在free后占用dst所指空间,那么对dst的操做将产生错误,若是系统并没占用dst所指空间,操做是成功的,可是隐患很大。blog
因此上面代码运行结果可能为:程序出错,非法访问内存;输出World字样。ip
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是无用的。
class