C语言面试题

目录

1. 简述 strcpy, sprintf与memcpy 的区别:

2. Heap与stack 的差别:

3. 链表和数组有什么区别:

4. sizeof 和 strlen 的区别:

5. 简述C、C++程序编译的内存分配情况:

6. 请解释一下“内存泄露”的概念,其产生的原因和后果是什么? 3


1. 简述 strcpy, sprintf与memcpy 的区别:

(1)操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。

(2)执行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。

(3)实现功能不同,strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字符串的转化,memcpy 主要是内存块间的拷贝。

2. Heap与stack 的差别:

(1)Heap 是堆,stack 是栈。

(2)Heap 上的空间手动分配/释放,Stack 的空间由操作系统自动分配/释放。

(3)Heap 是很大的自由存储区,Stack 空间有限。

(4.1)C中的 malloc 函数分配的内存空间即在堆上,C++中对应的是 new 操作符。

(4.2)程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行

3. 链表和数组有什么区别:

(1)存储形式:数组4是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。

(2)数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。

(3)数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动。

(4)越界问题:链表不存在越界问题,数组有越界问题。

4. sizeof 和 strlen 的区别:

(1)sizeof 是一个操作符,strlen 是库函数。

(2)sizeof 的参数可以是数据的类型,也可以是变量,而 strlen只能以结尾为‘\0‘的字符串作参数。

(3)编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。

(4)数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。

5. 简述C、C++程序编译的内存分配情况:

(1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。 例如全局变量,static 变量等。

(2)在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配:即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。一个C、C++程序编译时内存分为 5大存储区:堆区、栈区、全局区、 文字常量区、程序代码区。

6. 请解释一下“内存泄露”的概念,其产生的原因和后果是什么? 3

内存泄露指的是程序在运行过程中系统申请了内存资源后没有释放掉,导致系统内存资源不断减少的情形。产生内存泄露的原因是多样的,包括直接内存申请后未能及时释放、调用了包含内存申请的接口后未做释放处理等,程序出现内存泄漏的BUG会导致系统可用内存减少,响应变慢,最终系统无法运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值