导航菜单
首页 >  c语言面试真题  > C语言面试题汇总(持续更)「建议收藏」

C语言面试题汇总(持续更)「建议收藏」

大家好,又见面了,我是你们的朋友全栈君。

笔者最近在找工作,因此对应聘C/C++嵌入式开发工程师容易被问到,或者经常搞不清楚的问题做一个汇总,也希望能对找工作的小伙伴起到帮助参考的作用。本篇集中于C语言方面的面试题目。

因为是自己总结的,可能会存在错误,还烦请各位读者批评指正。

一、变量内存分配1. 一个由C/C++编译的程序占用的内存分为以下几个部分:

①栈区 —— 局部变量 —— 向低地址生长 —— 自动释放 —— 其操作方式类似于数据结构中的栈。

②堆区 —— 向高地址生长 —— 手动分配、释放的存储区 —— malloc,free —— 它与数据结构中的堆是两回事,分配方式倒是类似于链表

③全局/静态存储区static —— 全局变量,静态变量,程序运行结束后自动释放

④常量存储区const —— 常量字符串储存在这里。储存在常量区的只读不可写。程序运行结束后自动释放

⑤代码区 —— 存放函数体的二进制代码。

静态内存分配:编译时分配,包括:全局、静态全局、静态局部动态内存分配:运行时分配:包括:栈(局部变量),堆(C语言常用到的变量被动态地分配到内存当中:malloc,calloc,realloc,free函数)

——> const修饰的全局变量也储存在常量区;

——> const修饰的局部变量依然在栈上。

代码语言:javascript复制int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; //123456int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; //123456\0在常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 }在常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); //123456int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; //123456\0在常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 }放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 }2. 存储类(内存管理):

①栈:局部变量,函数调用传参的过程。 ②堆:动态存储区,需要程序员去申请释放 ③数据段(data段):显式初始化仅非零的全局变量

3.static修饰的变量

(1)static修饰局部变量(静态局部变量)与普通局部变量相比: ① 静态局部变量作用域与连接属性,和普通局部变量一样 ② 存储类:静态局部变量分配在data/bss段,普通局部变量在栈上 ③ 生命周期:因为存储类的不同,静态局部变量生命周期变长了,直到程序结束

——所以当静态局部变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能够再对它进行访问,直到该函数被再次调用,并且值不变。

(2)static修饰的全局变量or函数与普通的相比: ① 存储类、生命周期、作用域都一样 ② 差别在于:static修饰的全局变量的连接属性是内连接,普通的是外连接 即:static修饰的全局变量不能给文件调用——这也是静态变量和全局变量的区别。

对于局部变量来说,

相关推荐: