前言:
今天你们对“c语言文件题”大致比较珍视,姐妹们都想要知道一些“c语言文件题”的相关内容。那么小编同时在网摘上网罗了一些关于“c语言文件题””的相关内容,希望你们能喜欢,咱们快快来了解一下吧!这是几年前的C语言面试题目,虽然过了几年了,我相信,还是非常有价值的,因为,c语言的东西变的很少,可以说没有变,整体来看,题目不多,但面试的挺全面,前几道是基础理论,需要掌握,不少人,c语言用了好几年了,都回答不好,很多东西,心里明白,但说不出来,这就是理论上的欠缺,需要学习一下。
1、内存溢出与内存泄露的区别。
这道题目可以说是老生常谈的问题,必须得知道:
首先说说内存溢出,内存溢出简单地说,即指要求分配的内存超出了系统所能提供的,比如你申请了一个10字节的内存空间,你硬要往里塞11字节大小的数据,自然就满了,溢出了嘛(如代码示例1)。
其实数组越界也是一种内存溢出,比如写数据时超出了数组范围(越界读数组数据并不算内存溢出)。数组填充越界以后,再往里塞的话,就会挤占栈内存(一般数组声明为局部变量,局部变量在栈区自动分配内存)。
越界的部分被当作局部变量占用栈内存,因为栈是从RAM的底部往上长(存数据)的,而程序运行的其他数据是从顶部往下的,所以当栈越存越多,
越积越高的时候,栈就会和程序运行时的数据碰头,二者占满整个RAM内存,此时栈再继续消耗,栈再向上长,直接覆盖掉程序运行时所需的变量,程序就要跑飞了。这么看来内存溢出也是很可怕的。
void arr_test() { int arr[10]; arr[10] = 10; }
这种错误,也是经常出现的一个错误,这个错误一出,程序就直接崩溃了
接着:着说说内存泄漏,一般所说的内存泄漏是指堆内存的泄漏(Heap leak),在对堆上动态申请内存,使用后未及时释放,即会出现内存泄漏。顺带说一下,如果释放了指针所指内存,但是未立即将指针置为NULL,就会造成野指针(如代码示例2)。
一次内存泄漏可能不会被察觉,可能也不会有什么危害,但是内存泄漏的累积会造成内存用竭,那后果就严重了。比如内存泄漏出现在循环体中。当然还另有一些其他形式的内存泄漏,如由于系统资源的泄漏(Resource leak )造成的内存泄漏等等。
根据内存泄漏的发生频率,一般内存泄漏可分为以下4种:
常发性内存泄漏;
偶发性内存泄漏;
一次性内存泄漏;
隐式内存泄漏。
void heap-leap_test { char *p = (char *)malloc(sizeof(char)); //exe task free(p);//若不释放指针p所指内存空间,则会造成内存泄漏。 p = NULL;//若不置指针p为NULL,则p就会成为野指针。 }
这种错误不声不响的,现象就是内存占用不断增大,以前项目中遇上这种问题的。
2、static的作用?
static的作用就是变量在静态存储区,具体是这样说:
(一)在C语言中static的作用如下
(1)static修饰局部变量时,修饰的静态局部变量只执行一次,延长局部变量的生命周期,在程序运行结束后才会释放。
(2)static修饰全局变量时,全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
(3)static修饰函数时,函数只能在当前文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0。
这个static作用有局部+静态存储区的两层含义,这二层含义必须都得理解
3、堆分配内存?
四种内存分配方式:
1.堆heap:程序员手动分配和释放的,malloc/free,new/delete
2.栈stack:由编译器自动分配和释放,用于存放局部变量和参数
3.全局/静态区:存放全局变量和静态变量,在程序编译时分配
4.文字常量区:存放常量字符串
堆:是一块不连续的高地址扩展的内存区域结构,因为是有链表来存储空闲内存地址,所以不连续,因为向高地址扩展,所以堆获得的空间受限于虚拟内存,比栈的空间大
大的空间的数据,一般都是用堆,这也是c语言中最有难度的一个地方,自由意味着风险和强大
4、算法题目,转圈数M数,最后出局的是哪个数。
就是循环链表的一个实现
由于比较复杂一些,具体实现,下个文章,将会详细介绍
标签: #c语言文件题