C面试题2

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:进程之间通信的途径
共享存储系统
消息传递系统
管道:以文件系统为基础

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值