1.strcpy和memcpy区别:
函数原型:
char* strcpy(char* dest, const char* src);
void *memcpy( void *dest, const void *src, size_t count );
区别:
strcpy只能复制字符串,memcpy可以复制任意内容,例如整形、字符数组、结构体、类等;
strcpy不需要指定长度,在遇到字符串结束符’\0’时才会结束,容易缓冲区溢出,是不安全的,memcpy根据第三个参数决定复制的长度。
2.read和fread区别:
fread是c标准库函数,操作对象是file stream, fread通过read来实现,采用了缓冲读写的方式,一定时间才调用read,速度快。
read是和操作系统有关的系统调用,操作对象是file descriptor,无缓冲,调用时就会进行一次外设操作,开销大,当处理一些特殊描述符(如套接口,管道)时需要用read。
3.深拷贝和浅拷贝的区别:
浅拷贝只是增加了一个指针指向已经存在的内存,深拷贝会申请一个新的内存并增加一个指针指向新内存;采用深拷贝在释放内存时不会出现浅拷贝时重复释放同一内存的错误。
4.用户态和内核态的区别:
程序运行在3级特权级时,称之为运行在用户态,大部分用户直接面对的程序都运行在用户态,当程序运行在3级特权级之上,称之为运行在内核态;
用户态到内核态切换有三种方式:系统调用、异常、外围设备中断。
5.互斥量和信号量的区别:
(1)互斥量用于互斥,信号量用于同步,这是根本区别
(2)互斥量值只能为0/1,信号量值可以为非负整数
(3)互斥量加锁解锁由同一线程,信号量可以一个线程释放,一个线程得到。
互斥量和二元信号量的区别就是第三点。
6.Java中Vector和ArrayList的区别
vector和arraylist实现了同一接口list,vector与arraylist不同点之一在于所有vector的成员方法都有synchronized关键字修饰,因此说vector是线程安全的,但对于复合操作,vector仍需要同步处理。
例:if(!vector.contains(element))
vector.add(element);
尽管contains和add方法实现了同步,但多线程情况下,在两行之间线程切换是不安全的。
7.字符指针和字符数组的区别
char* str = “This is a string”;
char string[] = “This is a string”;
str是一个变量,可改变str使它指向不同的字符串,但不能改变str所指的字符串常量。
string是一个数组,可以改变数组中保存的内容。
8.重载(overloading)、重写(overriding)和隐藏(hiding)
重载:同一作用域的不同函数使用相同函数名,但函数的参数个数或类型不同;
重写:派生类对基类中虚函数重新实现,即函数名和参数都一样,函数实现体不一样;
隐藏:派生类中的函数屏蔽基类中具有相同名字的非虚函数
主要从作用域、有无virtual、函数名、参数类型、返回值等方面考虑。