本文将会分享一些C语言相关的题目,主要是腾讯面试喜欢考察的一些题型,比如说自己手写一些库函数,比如
或者
。这类题目基本上只能用C语言来实现了,比如笔者这种C语言小白来说,面试手写这些题目还是比较难受的。
笔者本科面试腾讯光子工作室的时候,当时就出了怎么一道题,就是尽可能用最小的内存来保存一个ipv4地址,并且支持这种保存形式和字符串形式的ipv4地址的互相转换。很显然,考虑到ipv4地址有四段,每一段的大小在0到255之间,是可以用八个比特来保存的,所以可以用一个无符号的32位整数来保存,至于和字符串的相互转换,无非就是各种移位和字符串拼接分割等操作。
本题在牛客网上有一个测评链接。
后来笔者研究生期间面试腾讯天美实验室时,面试官给了一道题目,要实现。这个实现自然简单,但是简单的问题往往需要注意很多东西。首先,要注意函数签名,参数应该用指针形式,这样泛化性更强,而且源地址参数要加关键字,一定程度上避免被改写。其次,基本的参数校验得有,两个指针参数不能为空。最后,就是要考虑两个区域是否存在交叉,当时面试官提醒这个,笔者的第一反应是判断出这种情况直接报错返回,但面试官强调这种情况下保证拷贝成功即可。所以就是要判断源区域和目标区域交叉的方式,如果源区域在前,这种情况下从前往后一个一个字节拷贝就会出问题,因为在拷贝初期,会将源区域的尾部污染掉,所以要从后往前一个一个字节拷贝。类似的还有函数,不过其实在库函数实现中,是不考虑这种内存区域交叉的情况的。
以上的代码给出了上面所说的一些问题的解决方案,注意代码中封装了大量字符串的操作,而没有使用库中的函数。
- 程序异常崩溃:C系列语言有个恶心的地方就是这个,运行的时候莫名其妙就崩溃退出了,没有任何报错信息,这种情况往往是空指针或者段错误之类的问题,但是完全不知道在哪一行出现的问题。可以在gdb调试下,输入或者可以看到崩溃处的完整函数调用链
- gdb调试:gdb <可执行文件>进入调试模式;run 运行程序;break 或者 b设置断点;step 或者 s 进入函数内部,单步执行;next 或者 n 不进入函数内部,单步;continue 或者 c 继续运行直到下一个断点
- 函数返回局部变量指针:这个也算是一个坑了,其实在编码的时候,程序静态检查已经提示这个问题了。函数里的局部变量是分配在栈上的,这样返回指针,在调用方获取到的指针其实是一个空指针。而在golang语言里,针对这种情况会做逃逸分析,这样局部变量会被分配在堆上。但这样其实也影响了垃圾回收GC。一般对于简单变量,没有必要为了减少拷贝返回变量的指针,只要当复杂类型时才应该考虑返回指针。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/35725.html