面试求职经典问题Word文件下载.docx
《面试求职经典问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《面试求职经典问题Word文件下载.docx(43页珍藏版)》请在冰点文库上搜索。
{
chara;
doubleb;
intc;
chard;
};
structs2
charb;
doubled;
cout<
sizeof(s1)<
//24
sizeof(s2)<
//16
同样是两个char类型,一个int类型,一个double类型,但是因为对界问题,导致他们的大小不同。
计算结构体大小可以采用元素摆放法,我举例子说明一下:
首先,CPU判断结构体的对界,根据上一节的结论,s1和s2的对界都取最大的元素类型,也就是double类型的对界8。
然后开始摆放每个元素。
对于s1,首先把a放到8的对界,假定是0,此时下一个空闲的地址是1,但是下一个元素d是double类型,要放到8的对界上,离1最接近的地址是8了,所以d被放在了8,此时下一个空闲地址变成了16,下一个元素c的对界是4,16可以满足,所以c放在了16,此时下一个空闲地址变成了20,下一个元素d需要对界1,也正好落在对界上,所以d放在了20,结构体在地址21处结束。
由于s1的大小需要是8的倍数,所以21-23的空间被保留,s1的大小变成了24。
对于s2,首先把a放到8的对界,假定是0,此时下一个空闲地址是1,下一个元素的对界也是1,所以b摆放在1,下一个空闲地址变成了2;
下一个元素c的对界是4,所以取离2最近的地址4摆放c,下一个空闲地址变成了8,下一个元素d的对界是8,所以d摆放在8,所有元素摆放完毕,结构体在15处结束,占用总空间为16,正好是8的倍数。
这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小,看下面的例子:
chara[8];
structs3
s1s;
structs4
s2s;
//8
sizeof(s3)<
//9
sizeof(s4)<
//16;
s1和s2大小虽然都是8,但是s1的对齐方式是1,s2是8(double),所以在s3和s4中才有这样的差异。
所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。
posted@2006-09-1121:
42顽主阅读(493)|评论
(1)|编辑收藏
realloc更改已配置的内存空间
________________________________________
相关函数:
malloc,calloc,free,brk
表头文件:
#Include<
stdlib.h>
函数定义:
void*realloc(void*ptr,size_tsize)
函数说明:
参数ptr为指向先前由malloc()、calloc()、realloc()所返回的内存指针,而参数size()为新配置的内存大小,其值可比原内存大或小。
若小,内存内容并不会改变,且返回指针为原来内存启起地址;
但若大,则realloc()不一定会返回原先的指针,原先的内容虽不会改变,但新多出的内存则未设置初值。
若是参数ptr指针为NULL,则调用相当于malloc(size);
若参数size为0,此调用相当于free(ptr)
返回值:
成功返回指针,失败返回NULL
范例:
main()
char*ptr1=malloc(10);
char*ptr2;
memset(ptr1,'
A'
10);
*(ptr1+10)='
\0'
printf("
beforerealloc:
ptr=%x[%s]\n"
ptr1,ptr1);
ptr2=realloc(ptr1,40960);
afterrealloc:
ptr2,ptr2);
}
posted@2006-09-1010:
47顽主阅读(205)|评论
(1)|编辑收藏
melloc()free()与newdelete
mallocfree
与
newdelete
(1)分配空间时,malloc只给变量或对象(数组)在内存中申请足够的空间,而没有创建类的对象。
而new则构造完整的对象
(2)释放内存时,free只消除掉该对象指向的内存,而原对象没有调用析构函数。
delete在每个对象释放前都要调用析构函数。
格式:
char*p=(char*)malloc(10*sizeof(char));
free(p);
char*p=newchar[10];
delete[]p;
//其中delete格式中[]表示删除相应的对象数组;
而缺少[]时表示删除单一的对象。
07顽主阅读(85)|评论(0)|编辑收藏
c++面试题
1.是不是一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?
virtual修饰符会被隐形继承的。
private也被集成,只事派生类没有访问权限而已
virtual可加可不加
子类的空间里有父类的所有变量(static除外)
同一个函数只存在一个实体(inline除外)
子类覆盖它的函数不加virtual,也能实现多态。
在子类的空间里,有父类的私有变量。
私有变量不能直接访问。
--------------------------------------------------------------------------
2.输入一个字符串,将其逆序后输出。
(使用C++,不建议用伪码)
#include<
iostream>
usingnamespacestd;
voidmain()
chara[50];
memset(a,0,sizeof(a));
inti=0,j;
chart;
cin.getline(a,50,'
\n'
);
for(i=0,j=strlen(a)-1;
i<
strlen(a)/2;
i++,j--)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
a<
//第二种
stringstr;
cin>
>
str;
str.replace;
3.请简单描述Windows内存管理的方法。
内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~
我先说个大概,希望能够抛砖引玉吧
当程序运行时需要从内存中读出这段程序的代码。
代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。
把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。
这个就是内存管理所要做的事。
内存管理还有另外一件事需要做:
计算程序片段在主存中的物理位置,以便CPU调度。
内存管理有块式管理,页式管理,段式和段页式管理。
现在常用段页式管理
块式管理:
把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。
这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。
页式管理:
把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。
段式管理:
把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。
一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。
段页式管理:
结合了段式管理和页式管理的优点。
把主存分为若干页,每一页又分为若干段。
好处就很明显,不用我多说了吧。
各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。
这只是一个大概而已,不足以说明内存管理的皮毛。
无论哪一本操作系统书上都有详细的讲解
4.
#include"
stdafx.h"
#defineSQR(X)X*X
intmain(intargc,char*argv[])
inta=10;
intk=2;
intm=1;
a/=SQR(k+m)/SQR(k+m);
%d\n"
a);
return0;
这道题目的结果是什么啊?
define只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的
a/=(k+m)*(k+m)/(k+m)*(k+m);
=>
a/=(k+m)*1*(k+m);
a=a/9;
a=1;
5.
const符号常量;
(1)constchar*p
(2)charconst*p
(3)char*constp
说明上面三种描述的区别;
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如:
constchar*p;
charc1='
a'
charc2='
b'
p=&
c1;
//ok
c2;
*p=c1;
//error
这两个好象是一样的,此时*p可以修改,而p不能修改。
(4)constchar*constp
这种是地址及指向对象都不能修改。
6.下面是C语言中两种if语句判断方式。
请问哪种写法更好?
为什么?
intn;
if(n==10)//第一种判断方式
if(10==n)//第二种判断方式
如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=
7.下面的代码有什么问题?
voidDoSomeThing(...)
char*p;
...
p=malloc(1024);
//分配1K的空间
if(NULL==p)
return;
p=realloc(p,2048);
//空间不够,重新分配到2K
A:
p=malloc(1024);
应该写成:
p=(char*)malloc(1024);
没有释放p的空间,造成内存泄漏。
8.下面的代码有什么问题?
并请给出正确的写法。
voidDoSomeThing(char*p)
charstr[16];
assert(NULL!
=p);
sscanf(p,"
%s%d"
str,n);
if(0==strcmp(str,"
something"
))
sscanf(p,"
这句该写成:
str,&
n);
9.下面代码有什么错误?
Voidtest1()
{
charstring[10];
char*str1="
0123456789"
strcpy(string,str1);
}
数组越界
10.下面代码有什么问题?
Voidtest2()
charstring[10],str1[10];
for(i=0;
i<
10;
i++)
{
str1[i]='
}
11.下面代码有什么问题?
Voidtest3(char*str1)
if(strlen(str1)<
=10)
==数组越界
==strcpy拷贝的结束标志是查找字符串中的\0因此如果字符串中没有遇到\0的话会一直复制,直到遇到\0,上面的123都因此产生越界的情况
建议使用strncpy和memcpy
12.下面代码有什么问题?
#defineMAX_SRM256
DSNget_SRM_no()
staticintSRM_no;
//是不是这里没赋初值?
intI;
for(I=0;
I<
MAX_SRM;
I++,SRM_no++)
SRM_no%=MAX_SRM;
if(MY_SRM.state==IDLE)
break;
if(I>
=MAX_SRM)
return(NULL_SRM);
else
returnSRM_no;
系统会初始化staticint变量为0,但该值会一直保存,所谓的不可重入...
13.写出运行结果:
{//test1
charstr[]="
world"
cout<
sizeof(str)<
"
:
char*p=str;
sizeof(p)<
chari=10;
sizeof(i)<
void*pp=malloc(10);
endl;
6:
4:
1:
4
14.写出运行结果:
{//test2
unionV{
structX{
unsignedchars1:
2;
unsignedchars2:
3;
unsignedchars3:
}x;
unsignedcharc;
}v;
v.c=100;
%d"
v.x.s3);
3
15.用C++写个程序,如何判断一个操作系统是16位还是32位的?
不能用sizeof()函数
A1:
16位的系统下,
inti=65536;
cout<
i;
//输出0;
inti=65535;
//输出-1;
32位的系统下,
//输出65536;
//输出65535;
A2:
inta=~0;
if(a>
65536)
"
32bit"
else
16bit"
16.C和C++有什么不同?
从机制上:
c是面向过程的(但c也可以编写面向对象的程序);
c++是面向对象的,提供了类。
但是,
c++编写面向对象的程序比c容易
从适用的方向:
c适合要求代码体积小的,效率高的场合,如嵌入式;
c++适合更上层的,复杂的;
llinux核心大部分是c写的,因为它是系统软件,效率要求极高。
从名称上也可以看出,c++比c多了+,说明c++是c的超集;
那为什么不叫c+而叫c++呢,是因为c++比
c来说扩充的东西太多了,所以就在c后面放上两个+;
于是就成了c++
C语言是结构化编程语言,C++是面向对象编程语言。
C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。
17.在不用第三方参数的情况下,交换两个参数的值
stdio.h>
inti=60;
intj=50;
i=i+j;
j=i-j;
i=i-j;
i=%d\n"
i);
j=%d\n"
j);
方法二:
i^=j;
j^=i;
方法三:
//用加减实现,而且不会溢出
a=a+b-(b=a)
18.有关位域的面试题(为什么输出的是一个奇怪的字符)
a.t='
效果相当于a.t='
&
0xf;
'
-->
01100010
0xf-->
00000010
所以输出Ascii码为2的特殊字符
chart:
4;
就是4bit的字符变量,同样
unsignedshorti:
8;
就是8bit的无符号短整形变量
19.inti=10,j=10,k=3;
k*=i+j;
k最后的值是?
60
20.进程间通信的方式有?
进程间通信的方式有共享内存,管道,Socket,消息队列,DDE等
21.
structA
chark:
unsignedlongm;
si