1.系统调用与库函数的区别?
答:库函数是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。
函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。
用户应用程序访问并使用内核所提供的各种服务的途径即是系统调用。在内核和用户应用程序相交界的地方,内核提供了一组系统调用接口,通过这组接口,应用程序可以访问系统硬件和各种操作系统资源。
1.系统调用是为了方便应用使用操作系统的接口,而库函数是为了方便人们编写应用程序而引出的,比如你自己编写一个函数其实也可以说就是一个库函数。
2.系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数。
3.read就是系统调用,而fread就是C标准库函数.
2.sizeof与strlen的区别?
答:
void main()
{char str[10]={"good\n"];
printf("%d\t",strlen(str));
printf("%d\n",sizeof(str);}
首先要对字符串要了解。字符串最后有个隐藏的字符'\0',标识该字符串结束。
'\n'是换行符号,只是一个字符而已。
sizeof 计算字符串长度时候会把最后的 '\0' 算进去,而strlen 不会。
(所以一般结果就是 sizeof 计算出来的长度 比 strlen的长度要多1个字节。
例如:这个sizeof("hello")=6,而strlen("hello")=5。)
但是sizeof 在计算数组的时候,是计算这个数组的最大长度,而不是数组内部数据的长度。
所以问题中的 strlen结果是5,而sizeof结果是10 。'\n'也占一个字节。
除此之外,还要注意,当sizeof后面带一个指针的时候,实际上是计算指针的长度,一般32位设备
指针长度是4个字节。而strlen依然是计算指针指向的长度。
例如:
char *a="hello";
sizeof(a)=4 <=-====因为a是指针,结果是指针的大小
strlen(a)=5 <======依然是5
3.c语言分配内存的方式有哪些?C语言中常见的内存错误有哪些?
答:
内存分配方式有三种:
1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
常见内存错误:
(1)内存分配未成功,却使用了他;
(2)内存分配成功,但尚未初始化就引用了他;
(3)内存分配成功并且已经初始化,但操作越过了内存的边界;
(4)忘记了释放内存,造成了内存泄漏;
(5)释放了内存却继续使用它。
4.什么是野指针,如何避免野指针?
答:
野指针:指向不确定地址的指针变量。(即没有初始化)使用野指针易因内存泄露出现段错误。而造成内存泄露的原因有两个:
1.访问了没有权限的内存(平时我们正确使用指针的时候,系统应经将相应的内存分配给用户,但是如果指向没有分配的内存,系统会判定我们没有权限)
2.访问了已经释放了的内存。
因为野指针主要是因为我们平时编程习惯造成的,因此我们只能避免野指针的出现,而不能杜绝。(请注意用词)我们在编程时,做到以下几点可以有效地避免野指针的出现。
第一,当一个指针没有指向时,我们一般默认指向NULL。(NULL代表内存的0地址,并且NULL是不允许做任何操作的)
第二,使用malloc分配内存。(在堆空间里分配内存)
#difine MAX_SIZE 1024;
char *ptr = (char *) maollc (sizeof (char) * MAX_SIZE);
请认真研究这样的表达式的优点,这个表达式在代码的维护性,扩展性都大大提高了。这方面是我们平时写代码时所应该提高的。
使用malloc也是有讲究的,我们应该依照下面的流程:
1.分配内存。(分配成功,返回内存的首地址;分配不成功,返回NULL)。
2.检查是否分配成功(若失败,则 exit(1) 退出程序)。
3.清空内存中的数据 (malloc分配的空间里可能存在垃圾值,因此我们需要清空,可以用到memset或bzero 函数)。
4.使用内存。
5.释放内存(free,这时ptr又变成野指针)。
6.写成NULL。
5.分别写出bool, int, float,指针类型的变量a与‘零’的比较语句?
答:
BOOL : if ( !a ) or if(a)
int : if ( a == 0)
float : const EXPRESSION EXP = 0.000001
<span style="white-space:pre"> </span>if ( a < EXP&& a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)
BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。
一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。
不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
EPSINON应该是一个很小的值吧 因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是 [-EPSINON,EPSINON] EPSINON一般很小,10的-6次方以下吧,具体的好像不确定的,和机器有关。