happyfish

BlogJava 首页 新随笔 联系 聚合 管理
  38 Posts :: 1 Stories :: 62 Comments :: 0 Trackbacks


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获取到了一个“合法”(编译器、语法合法)的地址。但该地址内容不可预料。
  送显之后,程序其它部分正常工作,但不会导致系统崩溃。最多是在屏幕上写了无休止的字符而已。

 

posted on 2005-07-25 18:04 小鱼儿 阅读(3276) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: