c语言面试问题
1:
int a[10];
int *p=a+1;//p将指向a[1]
p=&a+1;//p将指向a+10;
这是因为虽然a和&a的值都一样,是a[10]的首地址,但是&a类型为int (*)[5];而指针加 1 要根据指针类型加上一定的值, 不同类型的指针 +1 之后增加的大小不同
a 是长度为 10 的 int 数组指针,所以要加 10*sizeof(int)
2: 引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
2) 不存在指向空值的引用,但是存在指向空值的指针。
3:五大内存分区
在C++ 中,内存分成5 个区,他们分别是堆、栈、自由存储区、全局/ 静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new 就要对应一个delete 。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc 等分配的内存块,他和堆是十分相似的,不过它是用free 来结束自己的生命的。
全局/ 静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C 语言中,全局变量又分为初始化的和未初始化的,在C++ 里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
明确区分堆与栈
在bbs 上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。
首先,我们举一个例子:
void f() { int* p=new int[5]; }
这条短短的一句话就包含了堆与栈,看到new ,我们首先就应该想到,我们分配了一块堆内存,那么指针p 呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p 。在程序会先确定在堆中分配内存的大小,然后调用operator new 分配内存,然后返回这块内存的首地址,放入栈中
4:char a[]="abc';
char b[]={'a','b','c'}
求strlen(a)和strlen(b)
5:进程和线程的差别。
线程是指进程内的一个执行单元 , 也是进程内的可调度实体 .
6与进程的区别 :
(1) 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2) 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3) 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源 .
(4) 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
6:Heap 与 stack 的差别。
Heap 是堆, stack 是栈。
Stack 的空间由操作系统自动分配 / 释放, Heap 上的空间手动分配 / 释放。
Stack 空间有限, Heap 是很大的自由存储区
C 中的 malloc 函数分配的内存空间即在堆上 ,C++ 中对应的是 new 操作符。
程序在编译期对变量和函数分配内存都在栈上进行 , 且程序运行过程中函数调用时参数的传递也在栈上进行
7:以下代码中的两个 sizeof 用法有问题吗? [C 易 ]
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str 字符长度为 : " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函数内的 sizeof 有问题。根据语法, sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的 str 是一个静态定义的数组,因此其大小为 6 ,函数内的 str 实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此 sizeof 作用于上只将其当指针看,一个指针为 4 个字节,因此返回 4 。
8:进程之间通信的途径
共享存储系统
消息传递系统
管道:以文件系统为基础
9:死锁的 4 个必要条件
互斥、请求保持、不可剥夺、环路
10:进程之间通信的途径
共享存储系统
消息传递系统
管道:以文件系统为基础