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獲取到了一個“合法”(編譯器、語法合法)的地址。但該地址內容不可預料。
送顯之后,程序其它部分正常工作,但不會導致系統崩潰。最多是在屏幕上寫了無休止的字符而已。