9个面试必备问题 *
最好的C开发人员和工程师可以回答的全面来源的基本问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.
现在就雇佣一名顶级C开发人员面试问题
void指针是一种可用于指向任意类型的任何数据的指针. void指针只有在显式强制转换之后才能解引用. 例如:
Int a = 5;
Void *b = &a;
printf (" % d \ n”* ((int *) b));
不同之处在于预处理器在哪里查找要包含的文件. For the include
指令,文件名带双引号, 预处理器将其对文件的搜索限制在当前源文件所在的同一目录中, 然后转到编译器预先指定的标准目录. 另一方面, 当指令使用尖括号时, 预处理器在编译器预先指定的目录中搜索文件——通常是标准库头文件所在的目录.
悬空指针指向已经释放的内存位置. 例如:
Int *a = malloc(sizeof(Int));
free(a);
// a现在是一个悬空指针
内存泄漏与悬空指针完全相反. 当内存位置没有被释放时,就会发生内存泄漏,但是没有办法引用它们(例如.e.,没有指针指向它们).
Int *a = malloc(sizeof(Int));
a = 0;
//现在a不再指向我们刚刚分配的内存,导致内存泄漏
与带有垃圾收集器的高级语言不同, 在用C语言编程时,始终跟踪已分配的内存是至关重要的.
申请加入Toptal的发展网络
并享受可靠、稳定、远程 自由C语言开发者职位
当执行以下代码时,输出将是什么? Explain.
#include
#define SQUARE(a) (a)*(a)
Int main() {
printf (" % d \ n”,平方(4));
Int x = 3;
printf (" % d \ n”,广场(+ + x));
}
这个函数 gets()
从 stdin
并将它们存储在提供的输入缓冲区中. However, gets()
会继续阅读直到遇到换行符. 除非缓冲区足够大,或者被读取的行长度事先已知, gets()
可能溢出输入缓冲区,并开始覆盖内存,它不应该, 造成严重破坏或打开安全漏洞.
解决这个问题的一种方法是使用 fgets()
. 它允许你对读取的最大字符数进行限制:
Fgets (b, 124, stdin);
结构体是一种复杂的数据类型,它允许将多个变量存储在指定内存块的组中. 结构体的每个成员变量可以存储不同的数据,并且它们都可以同时使用.
Struct a {
int x;
char y;
} a;
例如,您可以将一个整数存储在 x
,和和一个字符 y
以上,相互独立.
A union, 另一方面, 将任何成员变量的内容存储在完全相同的内存位置. 这允许在相同的内存位置存储不同类型的数据. 结果是,给一个成员赋值将改变所有其他成员的值. 与struct不同,在任何给定时间,联合类型中可能只有一个成员是有用的.
union b {
int x;
char y;
} b;
例如,将字符存储在 y
可能会自动更改读取的整数 x
对无意义或不可预测的事物.
下面的代码片段使用强制类型转换将浮点数转换为整数:
浮动f = 1.0;
Int i1 = (Int) f;
Int i2 = * (Int *) &f;
printf (" % d \ n, i1);
printf (" % d \ n, i2);
输出结果如下:
1
1065353216
你能解释一下为什么结果不同吗?
第一个强制转换操作正确地将浮点数转换为整数, 由C标准指定. 第二次转换, however, 是否首先将浮点指针转换为整数指针,然后解引用以获得最终结果. 这样,编译器就可以有效地处理浮点数(通常以IEEE浮点格式存储)中的原始位,就好像它们是整数的位一样. 除了得到错误的结果之外,您还可能执行“错误读取”操作,在以下情况下 sizeof (int)
大于 sizeof(浮动)
(e.g. 在某些64位架构上).
尽管这种特殊的代码不太可能, 它演示了当只有指向要转换的变量的指针可用时,类型转换所涉及的风险之一. 实际上,指针必须解引用 before 它是铸造的.
在32位操作系统中,整数被存储为4字节.
Since a
是负的,它会存储在2的补码中吗. 当一个整数为负时我们想右移n位, 我们需要在前面加上1(而不是0)!)到左手边. 因此,答案是 0xFFFF
(%x
输出十六进制的值).
面试不仅仅是棘手的技术问题, 所以这些只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能回答所有的问题, 回答所有问题也不能保证成为A级考生. 一天结束的时候, 招聘仍然是一门艺术,一门科学,需要大量的工作.
为什么Toptal
提出面试问题
提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.
寻找C开发人员?
寻找 C开发人员? 查看Toptal的C开发人员.
尼古拉Vasović
作为一名软件工程硕士研究生和国家著名奖学金获得者, Nikola在Toptal开始了他的全栈开发生涯. 利用Flutter的专业知识进行跨平台移动开发, 他专门为初创公司精简MVP产品发布流程. Nikola是Varius Development的联合创始人,并担任首席技术官,在与全球知名企业合作的同时,扩展了他的DevOps和PM专业知识, 转变为多才多艺的IT专业人士.
显示更多Toptal连接 Top 3% 世界各地的自由职业人才.
加入Toptal社区.