笔试题整理【2】

一、系统调用与库函数的区别?

系统调用是为了方便应用使用操作系统的接口,而库函数是为了方便人们

编写应用程序而引出的,比如自己编写的一个函数也可以说就是一个函数。

系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某

一种内核的库函数。


具体区别:

系统调用:

1、依赖于内核,不保证移植性 2、调用系统内核的服务 3、操作系统一个入口 4、在内核空间执行 

5、运行时间属于系统时间 6、用户内核切换开销较大 7系统调用较少  fork open write


库函数:

1、平台移植性较好 2、调用函数库中的一段程序 3、一个普通功能函数的调用 4、在用户空间执行

5、运行时间属于用户时间 6、过程调用开销较小 7、库函数数量较多 printf scanf malloc


二、sizeof 与 strlen 的区别?

1、sizeof 是操作符, strlen 是函数

2、sizeof 操作符的结果类型是 size_t,它在头文件中 typedef 为 unsigned int 类型,该类型保证能容纳

实现所建立的最大对象的字节大小

3、sizeof 可以用类型做参数,sizeof(.....),strlen 只能用 char* 做参数 strlen(......)是函数

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

5、大部分编译程序在编译的时候 sizeof 就被计算过了,这就是 sizeof(x) 可以用来定义数组维数的原因。

strlen的结果要在运行的时候才能计算出来,它用来计算字符串的长度,不是类型占内存的大小

6、sizeof 后如果是类型,必须加括弧,变量可以不加,sizeof 是个操作符,而不是函数

7、计算字符串数组长度上有区别

8、如果计算指针指向的字符串长度用 strlen 


三、C语言分配内存的方式有哪些?C语言中常见的内存错误有哪些?

方式:

1、从静态存储区分配:全局变量,static 变量

2、从栈上分配:局部变量,函数参数

3、从堆上分配:使用 malloc 或者 new 操作符(C++)

内存错误:

1、内存分配未成功(最大可能 malloc 分配内存访问出现了越界)

2、分配成功,但是没有初始化

3、内存分配成功,但是操作越界

4、忘记释放内存或者释放了部分内存(内存泄漏)


四、什么是野指针?如何避免野指针?

野指针:指向内存被释放的内存或者没有访问权限的内存的指针

主要有3种:

1、指针变量没有被初始化

2、指针p被free或delete后,没有被置为NULL

3、指针操作超越了变量的作用范围

如何避免:

1、对指针进行初始化    char *p = NULL对指针初始化为NULL 用 malloc 分配内存 用已合法的可访问的内存地址对指针初始化

2、指针释放完内存,置为NULL


五、分别写出 bool, int, float, 指针类型的变量 a 与 " 零 " 的比较语句?

1、bool a

if (a)

{

}

if (!a)

{

}

2、int a

if (a == 0)

if (a != 0)

3、float a

if ((a >= -EPSINON) && (a <= EPSINON))

if ((a <= -EPSINON) || (a >= EPSINON))


六、编写函数,实现字符串逆序

第一个方法就是定义两个数组,将一个数组里面的内容从后往前付给另一个数组

#include <stdio.h>
#include <string.h>

int main()
{
	char a[20] = {"hello world!"};
	char b[20] = {0};

	Reverse(a, b);

	return 0;
}

void Reverse(char *a, char *b)
{
	char *p = a;
	char *q = b;
	int i = 0;
	int length  = strlen(a);

	p = p+length-1;

	for (i = 0; i < length; i++)
	{
		*b = *p;
		p--;
		b++;
	}

	printf("%s\n",q);

}

第二个方法就是找到字符串中间的位置然后将两边的字符进行调换

#include <stdio.h>
#include <string.h>

void Reverse(char *a)
{
	int i;
	char temp;
	int length = strlen(a);
	int n = length / 2;

	for (i = 0; i < n; i++)
	{
		temp = a[i];
		a[i] = a[length-i-1];
		a[length-i-1] = temp;
	}

	printf("%s\n", a);
}


int main()
{
	char a[] = {"hello world!"};

	Reverse(a);

	return 0;
}


猜你喜欢

转载自blog.csdn.net/ljf_djcrs/article/details/79377237