1.在进行进栈操作时,应该首先检查栈是否( 已满).
2.p操作使进程( )v操作使进程( ).
3.多任务操作系统的进程通讯方式有(管道)(共享内存)(发送信号)进程调度的方式有(抢夺)(非抢夺).
4.int a[3][4],(*p)[4];
p=a;
则*p+1指向(p[0][1]).
5.在一个顺序存储结构里,LO表示第一个存储单元的地址,设每个存储单元的长度为M,则第n个存储单元的地址为(LO + (n-1)*M).
6.进程死锁的条件不包括 a
a抢先 b循环等待 c互斥 d动态分配资源
7.有5个进程,一个正在运行状态,则就绪的进程最多的个数. c
a0 b1 c4 d5
8.写出运行结果 d
#include<iostream.h>
int fn(int a,int b)
{
if(b>0)
return a*fn(a,b-1);
else
return 1;
}
void main()
{
cout<<fn(5,3)<<endl;
}
a60 b70 c120 d125
9
union
{
struct
{
unsigned int x1:2;
unsigned int x2:3;
unsigned int x3:3;
}x;
char y;
}z;
如果令z.y=100则z.x.x3为 c
a 0 b 1 c3 d4
10
执行操作pushi(1),pop(),pop()后,栈顶元素为 d
a 0 b1 c2 d不确定
11
改程序中的错误
(1)
unsigned int sum(unsigned int base)
{
static unsigned int sum=0;
unsigned int index;
for (index=1;index<=base;index++)
sum+=index;
return sum;
}
(2)
unsigned char a;
int*b;
*b=100;
a=100;
while(a>=0)
{
a--;
........
}
1.unsigned char;无符号类型,当然a>=0永远成立,就算不停a--
死循环
2.int* b; 野指针,指向不定地址
*b=100; 改变不定地址的值,危险
(3)
class C
{
...
};
class B{
pribate:
*p;
public:
B(){p=new C[100];}
~B(){deldte p;}
};
B CreateB()
{
B b;
return b;
}
1、new [] 应该对应 delete[]
2、return b;隐含调用拷贝构造。类实现中最好提供拷贝构造函数的实现,默认为bit copy不应满足实际要求,另外题目意图可能还是这里:返回 B&。或者修改为
B* CreateB()
{
B* b = new B;
return b;
}
12
看程序写结果!
(1)
#include<iostream.h>
class A
{
public:
A(int y)
{
my=y;
mx=mx+my;
}
void display()
{
cout<<"a="<<my<<"b="<<mx<<endl;
}
private:
static int mx;
int my;
};
int A::mx=2;
void main()
{
A a1(2);
A a2(4);
a1.display();
a2.display();
}
(2)
chat *GetMemory(viod)
{
char p[]="hello world";
return p;
}
void Test(void)
{
char*str=NULL;
str = GetMemory();
printf(str);
}
13
使用fmc的CCriticalSection,CEvent类或Window API函数或伪代码加注释的方式表示
1.要是下面程序的结果只是a.x=4,a.y=5或a.x=4000,a.y=5000(而不是a.x=4000,a.y=5或a.x=4,a.y=5000)应该在什么位置加入什么代码?
struct A
{
int x.y;
}a;
fun1()
{
a.x=4;
a.y=5;
}
fun2()
{
a.x=4000;
a.y=5000;
}
AfxBeginThread(fun1,...);
AfxBeginThread(fun2,...);
(2)
有如下代码,要使线程1执行完后线程2才开始执行,应在什么位置加入什么代码??
Thread1()
{
程序段1
...
程序段2
}
Thread2()
{
...
}
main()
{
AfxBeginThread(fun1,...);
AfxBeginThread(fun2,...);
}
14
构造一个类Singleton,使该类只能存在一个实例.
将构造函数写为private的,然后通过一个成员静态函数来调用构造函数即可。
15
编写一个函数subs(char *str)打印出str的所有子串(例如1234的子串包括:1,2,3,4,12,13,14,23,24,34,123,234,1234)不能使用系统提供的有关字符处理的类库,库函数.
16
编写一个先入先出缓冲区的公共函数(或类库)程序.不限c c++.不能使用明显低效的方案
缓冲区的规则是:
1.缓冲区最大长度100m
2.向缓冲区存入数据时放在上次存入数据的后面
3.从缓冲区取出数据时,从缓冲区未被取走到数据的头部取.取出数据的缓冲区即可认为是空.以后杂再存入.
至少要为此缓冲区编写两个接口操作函数:
1.存入数据函数.第一个参数是int 长度值.第二个是指向二进制字节的指针.指向存入的数据.
2.取出数据函数.第一个参数是int 长度值.第二个是指字节的指针,指向取出数据后的内存位置.
问题1:
function_C()
{
static int A;
int B;
}
请问,A和B的区别
PS:我只回答出了,当程序运行完function_C后,A的值将会保存,直到
下一次进入function_C,A的值才会被改变;
当程序运行完function_C后,B的值就会立刻发生变化了。
请问:A和B各自存储在什么区域:
1:数据域 2:代码域 3:堆栈
A在数据域;B在栈。
问题2:
在32位编译系统中,
typedef struct
{
int A
char B
}T_s;
请问T_s的长度为几个字节,我回答的是6个字节。
有没有对齐的问题呀??
有的,8
问题3:
*char function_C
{
char str[4]="abcd";
return str;
}
function_A
{
char *ptr;
ptr=function_C;
}
请问这种用法对么?
问题4:
int *ptr;
typedef struct
{
int A
char B
}T_s;
T_s s[4];
ptr指向结构数组(s[4])
的第一个元素,
请问
ptr+1指向哪个元素,在该元素的什么位置。
8086/8088的微机只有一种工作模式(即实模式)只能处理1M以下的地址(16位),这种地址被城为实地址。后来Intel为了突破1M的内存的限制,推出了386等芯片,增加了保护模式,在32位保护模式下,程序可以访问4G内存空间。但同时为了同以前的程序保持兼容,所以旧程序在实模式下运行,而32位程序可以运行在保护模式下,从而最大地发挥服务器的能力。DOS是运行在实模式的,而Windows 9x/NT都是运行在保护模式的。CPU有专门的保护模式指令。
void FAR* memcopy(char *dst,char *src,size_t count)
{
void * ret = dst;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
1、完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数
有什么区别,你喜欢使用哪个,为什么?
2、变量的声明和定义有什么区别?
3、请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char a[30];
char *b = (char *)malloc(20 * sizeof(char));
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(b));
printf("%d\n", sizeof(a[3]));
printf("%d\n", sizeof(b+3));
printf("%d\n", sizeof(*(b+4)));
return 0 ;
}
4、请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。
a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请
给出该题的至少一个不同解法。
b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。
c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。
d)请编写一个 C 函数,该函数将一个字符串逆序。
e)请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回
该字符所在位置索引值。
f)请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,
该字符串是由同一字符组成的。
有关内存的思考题
1.void GetMemory(char *p)
{p = (char *)malloc(100);}
void Test(void)
{
char *str = NULL;GetMemory(str);
strcpy(str, "hello world");printf(str);
}
请问运行Test函数会有什么样的结果?
GetMemory()函数获取了一段内存空间,却没有很好地返回这个空间地址。产生内存泄露。
strcpy不申请内存,不进行地址校验,直接在内存00000000H处写入字符串,程序运行后,系统很可能崩溃。
2.
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
GetMemory()返回一个无效的,仅在该函数生命期内有效的一个字符串指针。str获取到了一个“合法”(编译器、语法合法)的地址。但该地址内容不可预料。
送显之后,程序其它部分正常工作,但不会导致系统崩溃。最多是在屏幕上写了无休止的字符而已。