【面试易错题】陷阱题集一

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是无用的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值