-------------------------------------------------
1、下面程序输出结果是什么?
void main(){
char ch1 = 64;
char ch2 = 64;
ch1 *= 2;
ch2 < <= 1;
printf(“\n%d----%d”,ch1,ch2);
ch1 /= 2;
ch2 >>= 1;
printf(“\n%d----%d”,ch1,ch2);
}
答案:
-128----128
-64----64
疑惑:
01000000乘以2和右移1位有什么区别,请详细解释
-------------------------------------------------
2、
#include
#include
class A{
public:
A(){m_a = 5;}
virtual ~A(){}
void print(){printf("\na \t%d",m_a);}
protected:
int m_a;
};
int main(){
A *p = new A;
memset(p,0,sizeof(A));
p->print();
delete p;
return 0;
}
答案:
程序输出:a 0
程序最后崩溃。
疑惑:
为什么能正常输出,但程序却要崩溃?或者既然程序崩溃,为什么还能正常输出?
-------------------------------------------------
3、
#include
class A{
public:
void func(){
print();
}
virtual void virtualFunc(){
print();
}
virtual void print(){
printf("\nAAAAAAA");
}
};
class B : public A{
public:
virtual void virtualFunc(){
print();
}
virtual void print(){
printf("\nBBBBBBBB");
}
};
int main(){
B *pb = new B;
A *pa = pb;
pa->func();
pa->virtualFunc();
pb->func();
pb->virtualFunc();
return 0;
}
输出结果:
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
疑惑:
func()不是虚函数,为什么pa->func()调用的是B的print();
-------------------------------------------------
4、
#include
void func(int a, int *p){
int c;
printf("\n&a\t=\t%p\n&p\t=\t%p\np\t=\t%p\n&c\t=\t%p",&a,&p,p,&c);
}
int main(){
int a=0,b=0;
func(a, &b);
return 0;
}
比较&a,&p,p,&c的大小
答案:
p>&p>&a>&c
&a = 0012FF24
&p = 0012FF28
p = 0012FF78
&c = 0012FF18
疑惑:
除了栈的生长方向,应该还考变量定义的顺序,是不是?请把详细过程解释一下?顺便说说栈生长方向的问题(上下哪头是大地址)。
-------------------------------------------------
5、
#include
#include
int main(){
int age = 22;
char *name = "my name is ";
printf("%s%d",name);
return 0;
}
答案:
my name is [一个随机数]
疑惑:
%d所取的是不是地址0的数据?不是的话,那这个随机数怎么来的,机理是什么,请解释。
-------------------------------------------------
6、
全局变量 int x, 多线程操作下不需要线程锁进行同步的操作是:
a、++x b、x++ c、x=0
答案:
不知道。
疑惑:
请解释,最好把机理说说,我没有多线程的经验,只曾纸上谈兵
-------------------------------------------------
7、
同一个进程的现线程不共享的是:
a、栈 b、静态变量 c、全局变量 d、new出的新对象 e、代码段
答案:
不知道。
疑惑:
我想选a,可又舍不得d,题目是单选啊。到底哪一个?请给出答案,并解释。
-------------------------------------------------
8、
printf,fprintf,sprintf哪一个执行的最快?
答案:
不确定。
疑惑:
我选printf,我的理解是,sprintf要写内存,fprintf写内存,还要写回磁盘,而printf直接输出显示。
-------------------------------------------------
9、
一共有1G的内存,win32操作系统,现在操作系统已经扎据内存512M,问还可以分配给应用程序多少内存?
答案:
不确定。
疑惑:
请给出答案,并给出理由。(依据是32位的寻址孔家的大小,还是操作系统分配的交换区的大小。若为后者,交换区怎么分配,请解释。或者还有其他依据?)
-------------------------------------------------
10、
char *p = new char[10*1024*1024];
char *q = (char*)malloc(10*1024*1024);
memset(p,0,10*1024*1024);
memset(q,0,10*1024,1024);
问:四个语句四个阶段,每个阶段执行后,操作系统分配的内存数量是多少?
-------------------------------------------------
11、
静态库a.lib中定义一个全局变量x。b.exe和c.dll都访问a.lib。b.exe先把a.lib中的x设置为1,接着c.dll读取a.lib的x,则读取的值为多少?
-------------------------------------------------
12、
c.dll又一个全局变量x=1。现在a.exe先访问c.dll,并把x设为0,接着b.exe又读取x,则读取的值是多少?
-------------------------------------------------
13、
阻塞的socket,不设置任何选项,在接收数据过程中,对方掉电,则结果怎样?
-------------------------------------------------
14、
上海的服务器,北京ping,ping的平均延迟是200ms,丢包率是5%,则实际传输中平均延迟和延迟变化怎样?
-------------------------------------------------
以上问题,求前辈指点,请讲解的尽量。
回答:
-------------------------------------------------
1、
>> 右移操作符
< < 左移操作符
右移和除以2等价
左移和乘以2等价
-------------------------------------------------
2、 virtual ~A(){}析构函数是虚函数,对象建立后会有一个成员指针,指向该函数
memset(p,0,sizeof(A)); 该函数把对象内存区域全部清0,结果把上述指针也设为0,
即虚函数指针成了空指针.
delete p;清除对象,将调用对象析构函数,这时因空指针引用,程序崩溃
-------------------------------------------------
3、 pa指向的是B类的对象,其print()函数是B类的函数.
因为print()函数是虚继承,A类的print()被B类的print()覆盖
-------------------------------------------------
4、
栈是从高地址向低地址生长的.
入栈,栈顶地址减小
出栈,栈顶地址增大
-------------------------------------------------
5、
name是个指针,指向常量区,%d是把它当作int型数据解释,打印出的是它的地址值
-------------------------------------------------
6、
选c
++x 先+后用
x++ 先用后+
这两个都包含两步操作,如果不加锁,程序中x的值就存在两种可能,不安全
-------------------------------------------------
7、
a
栈用于保存函数调用情况,不能共享,否则会互相破坏运行状态
new出的新对象可以共享,但要注意同步,防止死锁
-------------------------------------------------
8、
printf 向标准I/O设备输出,I/O设备很慢,比如屏幕
fprintf 向文件输出,文件存于磁盘,读写磁盘一般比I/O快
sprintf 向内存中字符串输出,内存读写,最快,不存在磁盘操作
-------------------------------------------------
9、
32位一共有4G访问地址,如果使用磁盘作为虚拟内存,还可以分配3.5G内存.
实际上大规模的程序都会用到虚拟内存,即用一部分磁盘资源扩充内存.
如何实现虚拟内存可以参考操作系统方面的专业书籍
-------------------------------------------------
10、
C/C++ code
char *p = new char[10*1024*1024]; //10M字节
char *q = (char*)malloc(10*1024*1024); //40M字节.一般用32位机,机器字长为4字节,这样分配是以字长为单位
memset(p,0,10*1024*1024); //内存清0,不分配新内存
memset(q,0,10*1024,1024); //同上
-------------------------------------------------
11、
lib是静态库,其中定义的变量可以改变么?
我想c.dll读到的是一个随机值
-------------------------------------------------
12、
x是0.动态库的优点
-------------------------------------------------
13、
无限等待?
-------------------------------------------------
14、
ping一般使用32字节的数据包,实际传输中数据包貌似一般为1024字节,
所以平均延迟要长些,丢包率还是5%,但一旦丢包,就要花更多时间重传.
所以丢包会引起不小的延迟
-------------------------------------------------
1.
在这里是没有区别的,在汇编中移位要分带符号和不带符号的移位,即移位
后是以什么来补充被移的部分
2.
程序在执行p->print()时都是正确的,但你的析构函数被memset给覆盖掉了
解决方法:要么删掉virtual,要么去掉delete p;
3.
func()虽然不是虚函数,但它里面调用的print()是。
4.
//C语法的标准是调用函数时,后面的参数先入栈
#include
void func(int a, int *p){
int c; //汇编中无操作
printf("\n&a\t=\t%p\n&p\t=\t%p\np\t=\t%p\n&c\t=\t%
p",&a,&p,p,&c);
/*
调用printf函数时,会在堆栈上产生c
|&c|----取得c的地址
|c|
|&a|----取栈上a的地址
|a|-----调用函数时被推倒栈的a的值
|&p|----再取p的地址
|p|-----b的地址
*/
}
int main(){
int a=0,b=0; //在堆栈上写入值分别是[ebp-4],[ebp-8]
func(a, &b); //将b的堆栈地址推倒栈上,将a的值推倒栈上
/*此时可推断出&b(p)的地址大于&p的地址大于a的地址(这个a不
是上面定义的a)
|&a|----取栈上a的地址
|a|-----调用函数时被推倒栈的a的值
|&p|----再取p的地址
|p|-----b的地址
*/
return 0;
}
5.
要调用函数,其参数是调用前被压入栈中的,就你这个程序,调用printf时
应当先有一个参数(name的地址)先被压入,可惜你只压了一个,那么函数会
自动在堆栈里将寻找一个相邻的元素当参数来用。不过这样使很危险的,因
为函数调用后会释放该数,如果是系统里非常重要的话那后果很严重
6.
对于一个内存值x,要先将它放到寄存器中,才能将它的值进行改变,再附值
回内存中,而x=0则可以不用,它可以这样mov dword ptr[ebp],0一条指令
完成
7.应当是栈
8.
printf牵涉到视频显示,fpringf牵涉到硬盘操作,所以springf是最快的
9.
现在的操作系统一般都是32位平坦模式的,即每个程序都有4g的内存空间,
跟以分配多少没多大关系
10.
char *p = new char[10*1024*1024]; //p指向10M内存空间的开头
char *q = (char*)malloc(10*1024*1024); //
分配(char *)指针类型的指针,现一般操作系统指针是4byte,故分配了40M
memset(p,0,10*1024*1024); //对p开始的地址作附0
memset(q,0,10*1024,1024); //同上,只是操作