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来复制字节数,所以这里可能会遗漏''字符串结束符,导致错误;
②dst为局部变量,当函数返回时,dst所指向的1024个字节空间将被释放(退栈),所返回的dst指针指向的内容会被其他内容所覆盖,所以返回的dst是无用的。