1.在進行進棧操作時,應(yīng)該首先檢查棧是否( 已滿).
2.p操作使進程( )v操作使進程( ).
3.多任務(wù)操作系統(tǒng)的進程通訊方式有(管道)(共享內(nèi)存)(發(fā)送信號)進程調(diào)度的方式有(搶奪)(非搶奪).
4.int a[3][4],(*p)[4];
p=a;
則*p+1指向(p[0][1]).
5.在一個順序存儲結(jié)構(gòu)里,LO表示第一個存儲單元的地址,設(shè)每個存儲單元的長度為M,則第n個存儲單元的地址為(LO + (n-1)*M).
6.進程死鎖的條件不包括 a
a搶先 b循環(huán)等待 c互斥 d動態(tài)分配資源
7.有5個進程,一個正在運行狀態(tài),則就緒的進程最多的個數(shù). c
a0 b1 c4 d5
8.寫出運行結(jié)果 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
執(zhí)行操作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--
死循環(huán)
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 [] 應(yīng)該對應(yīng) delete[]
2、return b;隱含調(diào)用拷貝構(gòu)造。類實現(xiàn)中最好提供拷貝構(gòu)造函數(shù)的實現(xiàn),默認為bit copy不應(yīng)滿足實際要求,另外題目意圖可能還是這里:返回 B&。或者修改為
B* CreateB()
{
B* b = new B;
return b;
}
12
看程序?qū)懡Y(jié)果!
(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函數(shù)或偽代碼加注釋的方式表示
1.要是下面程序的結(jié)果只是a.x=4,a.y=5或a.x=4000,a.y=5000(而不是a.x=4000,a.y=5或a.x=4,a.y=5000)應(yīng)該在什么位置加入什么代碼?
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執(zhí)行完后線程2才開始執(zhí)行,應(yīng)在什么位置加入什么代碼??
Thread1()
{
程序段1
...
程序段2
}
Thread2()
{
...
}
main()
{
AfxBeginThread(fun1,...);
AfxBeginThread(fun2,...);
}
14
構(gòu)造一個類Singleton,使該類只能存在一個實例.
將構(gòu)造函數(shù)寫為private的,然后通過一個成員靜態(tài)函數(shù)來調(diào)用構(gòu)造函數(shù)即可。
15
編寫一個函數(shù)subs(char *str)打印出str的所有子串(例如1234的子串包括:1,2,3,4,12,13,14,23,24,34,123,234,1234)不能使用系統(tǒng)提供的有關(guān)字符處理的類庫,庫函數(shù).
16
編寫一個先入先出緩沖區(qū)的公共函數(shù)(或類庫)程序.不限c c++.不能使用明顯低效的方案
緩沖區(qū)的規(guī)則是:
1.緩沖區(qū)最大長度100m
2.向緩沖區(qū)存入數(shù)據(jù)時放在上次存入數(shù)據(jù)的后面
3.從緩沖區(qū)取出數(shù)據(jù)時,從緩沖區(qū)未被取走到數(shù)據(jù)的頭部取.取出數(shù)據(jù)的緩沖區(qū)即可認為是空.以后雜再存入.
至少要為此緩沖區(qū)編寫兩個接口操作函數(shù):
1.存入數(shù)據(jù)函數(shù).第一個參數(shù)是int 長度值.第二個是指向二進制字節(jié)的指針.指向存入的數(shù)據(jù).
2.取出數(shù)據(jù)函數(shù).第一個參數(shù)是int 長度值.第二個是指字節(jié)的指針,指向取出數(shù)據(jù)后的內(nèi)存位置.
問題1:
function_C()
{
static int A;
int B;
}
請問,A和B的區(qū)別
PS:我只回答出了,當程序運行完function_C后,A的值將會保存,直到
下一次進入function_C,A的值才會被改變;
當程序運行完function_C后,B的值就會立刻發(fā)生變化了。
請問:A和B各自存儲在什么區(qū)域:
1:數(shù)據(jù)域 2:代碼域 3:堆棧
A在數(shù)據(jù)域;B在棧。
問題2:
在32位編譯系統(tǒng)中,
typedef struct
{
int A
char B
}T_s;
請問T_s的長度為幾個字節(jié),我回答的是6個字節(jié)。
有沒有對齊的問題呀??
有的,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指向結(jié)構(gòu)數(shù)組(s[4])
的第一個元素,
請問
ptr+1指向哪個元素,在該元素的什么位置。
8086/8088的微機只有一種工作模式(即實模式)只能處理1M以下的地址(16位),這種地址被城為實地址。后來Intel為了突破1M的內(nèi)存的限制,推出了386等芯片,增加了保護模式,在32位保護模式下,程序可以訪問4G內(nèi)存空間。但同時為了同以前的程序保持兼容,所以舊程序在實模式下運行,而32位程序可以運行在保護模式下,從而最大地發(fā)揮服務(wù)器的能力。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 函數(shù),請問這些函數(shù)
有什么區(qū)別,你喜歡使用哪個,為什么?
2、變量的聲明和定義有什么區(qū)別?
3、請寫出下面代碼在 32 位平臺上的運行結(jié)果,并說明 sizeof 的性質(zhì):
#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、請完成以下題目。注意,請勿直接調(diào)用 ANSI C 函數(shù)庫中的函數(shù)實現(xiàn)。
a)請編寫一個 C 函數(shù),該函數(shù)給出一個字節(jié)中被置 1 的位的個數(shù),并請
給出該題的至少一個不同解法。
b)請編寫一個 C 函數(shù),該函數(shù)將給定的一個字符串轉(zhuǎn)換成整數(shù)。
c)請編寫一個 C 函數(shù),該函數(shù)將給定的一個整數(shù)轉(zhuǎn)換成字符串。
d)請編寫一個 C 函數(shù),該函數(shù)將一個字符串逆序。
e)請編寫一個 C 函數(shù),該函數(shù)在給定的內(nèi)存區(qū)域搜索給定的字符,并返回
該字符所在位置索引值。
f)請編寫一個 C 函數(shù),該函數(shù)在一個字符串中找到可能的最長的子字符串,
該字符串是由同一字符組成的。
有關(guān)內(nèi)存的思考題
1.void GetMemory(char *p)
{p = (char *)malloc(100);}
void Test(void)
{
char *str = NULL;GetMemory(str);
strcpy(str, "hello world");printf(str);
}
請問運行Test函數(shù)會有什么樣的結(jié)果?
GetMemory()函數(shù)獲取了一段內(nèi)存空間,卻沒有很好地返回這個空間地址。產(chǎn)生內(nèi)存泄露。
strcpy不申請內(nèi)存,不進行地址校驗,直接在內(nèi)存00000000H處寫入字符串,程序運行后,系統(tǒng)很可能崩潰。
2.
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;str = GetMemory();
printf(str);
}
請問運行Test函數(shù)會有什么樣的結(jié)果?
GetMemory()返回一個無效的,僅在該函數(shù)生命期內(nèi)有效的一個字符串指針。str獲取到了一個“合法”(編譯器、語法合法)的地址。但該地址內(nèi)容不可預(yù)料。
送顯之后,程序其它部分正常工作,但不會導(dǎo)致系統(tǒng)崩潰。最多是在屏幕上寫了無休止的字符而已。