一、系统调用与库函数的区别?
系统调用是为了方便应用使用操作系统的接口,而库函数是为了方便人们
编写应用程序而引出的,比如自己编写的一个函数也可以说就是一个函数。
系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某
一种内核的库函数。
具体区别:
系统调用:
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;
}