C语言复习小结

章节题目---3、4、5
1. C语言的核心知识点是什么?

核心为函数,

分支1为基本数据类型,指针和数组

分支2为结构体、共用体(联合体)、空类型


2. 请描述C语言语句的分类

执行语句和非执行语句}

执行有1.独立语句(以;结尾):表达式语句,变量定义语句,函数调用语句,跳转语句,空语句

2.符合语句(以}结尾等):普通复合语句、选择语句、分支语句、循环语句、函数定义


3. 请描述C语言源码编译的全过程

预处理--------编译--------汇编-------***-----链接

*.c----*.i-----------*.s----------*.o--------**-----可执行文件

按照—定的规则〔可执行文件的格式)将所有.o以及用到的库文件的全部部分信息组合成可执行文件)
预处理编译汇编这三步对每个.c文件分别进行,相互之间没有任何关联

库开发:多个.o文件也可以采用相应指令(ar),将它们按照一定规则组合成静态库文件

多个.o文件也可以通过给gcc一些指定选项,将它们按照一定规则组合成动态库文件


4. 请描述C语言数据类型的分类以及如何学习

 
5.char、short、int、long、float、double和指针类型的sizeof分别是多少?
1,2,4,4/8,4/8,4,8


6.请描述基本类型变量定义语句的作用

1.确定类型

2.分配内存

3.起名

4.把首地址与变量名绑定


7. 变量四属性分别是什么?

- 显式属性:定义语句中已指定出来的

  - 数据类型

  - 变量名

- 隐式属性:定义语句中无法直接看出来,但实际上存在的

  - 空间首地址(左值,变量地址)

  - 当前空间存放的二进制位序列(右值,变量当前值)


8.什么是表达式?

有运算结果的式子

表达式依据计算结果可分为:

1. 数值表达式(数学表达式):运算结果为某一具体大小的数值

2. 逻辑表达式(条件表达式):运算结果只论成立不成立 或 是真(成立)是假(不成立) 或是非0(真)还是0(假)

3. 地址表达式:运算结果虽然也是某一具体大小的数值,但该数值为内存空间某一字节的编号即地址值

3 < 5

成立 ----- 非0 -----  真

不成立 ---- 0  -----  假

int x = 0;

&x

&(x+2)

x & y

表达式的组成要素有常量、变量、运算符和子表达式,

有没有运算结果是判断是不是表达式的标准,因此:

1. 运算符不是组成表达式必须的组成要素,单独的一个常量我们认为也是一个表达式,这个表达式的运算结果为该常量的值,

   同样,单独的一个变量我们认为也是一个表达式,这个表达式的运算结果为该变量的当前值。

2. 但是,我们在编程中由于任务需要,必须让计算机帮我们做很多运算,而这些运算必须使用到代表这种运算的运算符。

3. 一个表达式也可以成为另一个表达式的组成部分,其运算结果参与新表达式的运算。

4. 项目开发中不鼓励写太复杂的运算表达式,以免影响代码的可读性。


9. 什么是逻辑短路?


10. C语言支持几种除法运算?

/和%


11. 将一个变量指定位置0、置1、取反分别用什么运算?

&0置0   |1置1  ^1取反 


12. sizeof运算的特点

1. 编译阶段进行的运算,其组成的表达式在目标代码中被其计算结果所代替,

2. 计算结果的类型是unsigned long类型的别名size_t

章节题目---6
1. 何时需要函数声明?函数声明语句的作用?


2. 请描述函数定义的语法和函数定义的作用和函数返回方式


3. 请描述函数调用过程

       函数调用时,首先在调用前分配一个内存空间,调用函数时也就是调用分配的内存首地址。

       当函数执行到return关键字或者执行到最后时,被调用函数执行就执行结束,此空间的内存也将被释放。

章节题目---7、8:
1. 什么情况用多重if-else?什么情况用switch?

switch-case只能对整形数进行判断,而且是单个的整型数


2. switch语句中如果某个case没有break语句,代码如何执行?

会继续执行下一条语句


3. break语句适用于哪些语句、作用是什么?continue语句适用于哪些语句、作用是什么?

break结束循环体,


4. 编程过程中如何选择三种循环?

continue结束此行后的本次循环(结束一次循环)


5. 项目中死循环如何写?


6. do{}while(0);与普通复合语句{}的区别

前者可以使用break和continue等跳出语句,否则要使用goto语句,此语句非常危险;

章节题目---9、11
数组相关:
1. N维数组的sizeof怎么算?

Sizeof(N维指针)-> N维数组(或其他)的大小  如,二维数组的一维大小为第一维的数组整个的大小


2. 请描述三维数组定义语句的作用?

3个基本作用:

1.给该数组分配sizeof(N维数组名)个字节的内存空间2.该空间命名为N维数组名

3.该空间中每sizeof(T个字节描述—个T类型的元素N个

额外作用:

1.相当于定义M1个N-1维的数组,它们名字叫做N维数组名[第一维下标x1]x1---->[0,M1-1]

……

2. N.相当于定义了M1*M .."Mn-1Mn个元素类型的变量,它们名字叫做N维数组名(第一维下标[x1]第二维下标s2 ….(倒败第二维下标][最后一维下柄)


3. 如何给一个4维数组初始化?

N维数组名[M1][M2]....[Mn] =0.{0.f...N层嵌套...(档.}..-..}..--...};      //N个{}嵌套使用


4. 数组名相当于什么地址?

数组名相当于整个数组的首地址,若对其加1,则加了整个数组的大小的地址;


5. 数组下标的取值范围是什么?

是数组大小减1,也就是N-1;


6. 已知一个一维数组float arr[8],则&arr和&arr[0]分别是什么?

虽然地址值相同的,但是他们的类型大小不一样,若对其进行“+1“操作,前者+的时整个arr数组的大小,后者+的是arr的一个元素的大小。


7. 某个函数的形参为double arr[4][5][3][7],其等价于哪一种指针?

等价为四级指针;      等价为一维数组的三级指针; ……


8. 数组可不可以作为函数的返回值类型?

不可以

定义为静态后返回指针类型可以完成返回数组


9. 请背诵掌握数组关键知识的三句口诀

总决:**N维数组都可以看作是一维数组,这个一维数组中的元素都是N-1维的数组**

分决:

1. **数组名在表达式中单独出现时,其等价于:下标为0元素所在空间首地址**,两种情况除外:

   a. &数组名  此时数组名代表整个数组所占内存空间

   b. sizeof(数组名) 此时数组名代表整个数组所占内存空间

2. **数组类型作为函数形参类型,该形参完全等价于:指向数组元素的指针**,即用来存放地址值的变量(可以存放数组中某一个元素内存空间的首地址)


指针相关:
1. 什么是T类型的地址?

也就是在地址值的基础上,此地址内存中的二进制的作用不同。


2. 访问某块内存中的内容有几种方式?

直接用变量名进行访问

借助地址加*取地址


3. 指针类型的sizeof如何求?

4/8


4. 请描述一级指针变量定义语句的作用

分配空间

规定类型

获取所分配空间的首地址

确定变量名


5. 两个同类型的地址值相减所得的结果是什么?

是相邻的个数


6. 已知有T类型的地址值,对该地址值+整数是如何运算的?

地址值会加上这个(整数*T类型的字节数)


7. 地址类型转换运算的本质是什么?有可能发生什么样的错误?

改变地址内的二进制的作用或表现形式,发生越界和乱码的错误。


8. 已知有个指针变量名称为p,则&p和&(*p)有什么区别?

一个是对p指针取地址,一个是自身


9. 什么是空指针?什么是野指针?如何防止野指针?


10. 什么是通用指针?有何特点?如何使用?

void需要转化


11. 数组名单独写时相当于什么样的地址?

表示整个数组的首地址,大小为整个数组的大小,也就是所有元素在一起的大小


12. 形参类型是数组类型时相当于什么样的指针类型?

一维指针


13. 如何将一块内存空间通过形参传递给一个函数?

对其取地址,然后通过指针形式传递给函数。


14. 数组可不可以作为函数的返回值类型?

纯数组不可返回


15. 指针类型可不可以作为函数的返回值类型?如果可以需要注意什么?

注意不要返回局部变量


16. 指针类型的形参按其在函数中的使用方式如何分类?

1、值参数:函数体中只读该形参指向空间的内容。示例:查找 searchvalue.c 

2、结果参数:函数体中只改该形参指向空间的内容。示例1:一个函数求最大值和最小值 getmaxmin.c  示例2:两个数组相加到第三数组 addarray.c 

3、值-结果参数:函数体中既要用原内容又要向空间填写新内容。示例:排序函数 arraysort.c


17. 请描述二级指针变量定义语句的作用

1、分配 sizeof(Type *)个字节的内存空间(指针自身空间) 

2、给空间命名为指针变量名(指针自身空间) 

3、空间(指针自身空间)二进制位的作用是描述一个无符号整数,该整数的含义是另一内存空间(指针指向空间)第一个字节的编号(即地址值) 

4、指向空间中的二进制位作用是从首地址开始每sizeof(Type)个字节存放一个Type类型的元素,此元素为一级指针的地址


18. 请描述三级指针变量定义语句的作用

章节题目---10
1. 字符串用什么来存储?

一串连续的内存空间


2. 已知一个字符数组的定义为:char buf[]="hello",则sizeof(buf)、strlen(buf)、sizeof(buf[0])、sizeof(&buf[0])的值分别是多少?

.sizeof计算的是(整个内存的大小“包括“/0”),strlen是计算(正在使用的内存)


3. 字符串常量有何特点?

存储在静态存储区不可修改,而且在编译时就分配了空间和内容,


4. 已知有4个char *指针:p1指向某个字符型变量,p2指向一个未存放字符串的字符数组,p3指向一个存放着字符串的字符数组,p4指向字符串常量
   则,sizeof(p1) strlen(p1) sizeof(p2) strlen(p2) sizeof(p3) strlen(p3) sizeof(p4) strlen(p4)的值分别是多少?

未给初值的strlen的大小不确定。其他略


5. strcpy和strncpy的区别

前者是靠识别“/0“来识别拷贝的,而后者是靠”n“的大小是控制拷贝的大小的。


6. 请描述处理字符串的代码一般形式

Strstr(从右往左早相应字符切不改变原值),

char *strtok ( char *str1,const char *str2 ) ;从前往后找对应字符,会改变原值


7. scanf的%s和gets函数分别有什么毛病?

前者:%s 只能读取一个单词,空格、回车都将结束此输入程序,同时也没有办法防止越界

后者:解决了只能读取一个单词的问题,但是越界仍然无法防止。


8. 如何将"1234"转换成整数1234?

       略

章节题--12
动态分配相关:
1. 什么是内存泄露?

动态申请的内存没有及时释放的内存


2. 程序中用到的内存空间来源方式有几种?

两种方式:

1.固定分配(静态分配):编码时已经明确所需内存空间大小

C语言通过变量定义来实现

2动态分配:编码时不知所需内存空间大小,程序运行到某处才能计算所需空间的大小

       程序中调用malloc函数向操作系统申请,使用完毕后还需调用free函数将申请到

的内存空间归还给操作系统(释放空间、回收空间)


3. 请描述动态分配内存的代码模块

int *p = (int *)malloc(sizeof(int));

    if(p == NULL)

        printf("GG\n");


4. 程序运行过程的内存划分哪几个区域?每种区域中内存如何获得?

程序运行过程占用的内存操作系统会将其划分为4个部分(内存四区):

1、栈区:满递)减的顺序柱,每个进程、线程都有它们专门的栈区,栈区大小是固定的(由操作系统来指定,如桌面版Linux规定为8M),因此可能会发生栈溢出

A、非static局部变量定义、函形参定义语句被执行时从栈区中为对应变量、形参分香控间(其本质是对满递减的顺序栈进行一次入栈操作)

B、非static局部变量、函数形参的内存空间在变量所属复合执行完毕、形参所属函数定义(却本次调用返回)执行完毕,空间被回收(其本质是对满递减的顺序进行一次出栈操作)

自动存储时期

2、堆区:空闲的自由空间,动态分香的空间来自本区域,使用该区域内的一部分内存需向操作系统申请,使用完毕后应及时归还给操作系统

动态存储时期

3、数据区:本区域总大小,在编译器编译源码时由编译器进行统计

A、全局变量、static局部变量、字符串常量(位于数据区的只读部分)

B、静态存储时期

4、代码区:按函数形式组织的指令-------函数指针

静态存储时期


5. 说出7种常见的内存操作错误

  1. 内存泄露
  2. 越界
    a、死掉
    b、逻辑混乱
  3. 野指针
  4. 野值—未初始的--- memset(&stTest,0,sizeof(struct sample_struct));

5、栈溢出

6、试图修改数据区的常量区

7、二次释放


6. 请描述memcpy和strcpy的区别

前者可以拷贝任何东西,后者只能是数组


7. 请描述memcpy和memmove函数的区别

前者若是有内存重合不可拷贝,特指(地址)重合


8. C语言编程的第二大基本原则是什么?

类型一致原则

内存一致原则


变量特性相---13
1. 什么是作用域?

标识符的作用域:标识符名称的默认使用范围---就是哪段代码内可以直接用命名的名称代表定义的实体,而无需做其它辅助操作

C语言中只要程序员可以命名的东东均有作用城:变量名、函数名、类型名、宏名、枚举常量名(成员名由于不能独立使用因此不用考虑名称使用范围)

1>局部作用域:定义语句所在行开始------定义语句所隶属的复合语句结尾(函数形参隶属于函数体这个复合语句)

2>文件作用域:定义语句所在行开始-------定义语句所隶属.c文件结尾


2. 什么是链接性?

标识符的链接性:标识符作用域之外,能不能用相应的名称代表定义的实体,如能又是什么样范围,又需做什么的辅助

1>无链接性:该名称只能在其作用域范围内使用

2>内部链接性:作用域之外,当前.c文件内可用,用前需辅助对应的声明语句

3>外部链接性:作用域之外,任何.c文件内可用,用前需辅助对应的声明语句


3. 什么是生存期?

空间的生存期:是指程序中分配得到内存空间在什么样的时间段内可用

  1. 自动存储时期:从定义语句被执行这个时刻开始------该定义语句所隶属的复合语句被执行完这个时刻
  2. 静态存储时期:程序运行前-------程序运行结束(整个程序运行期)

3>动态存储时期: malloc成功分配-----对应free函数调用


4. 请描述static关键字的作用

static关键字小结:

1.static修饰局部变量时,将局部变量的生存期由自动存储时期改为了静态存储时期

2.static修饰全局变量时,将全局变量的链接性由外部链接改为了内部链接

3. static修饰函数定义时,将函数的链接性由外部链接改为了内部链接


5. 请描述register关键字的作用

register和auto的区别

1、register关键字是一个建议性质的关键字,而不是强制,只有满足如下情况时才生效:

  1. sizeof不能超过一个CPU寄存器的容量
  2. 程序运行该处时有空闲的CPU寄存器

3>后续代码中没有对该变量的取地址操作

2、现在的编译器都比较智能,非static局部变量和函镬婚参即使不加register, 它也会尽量去用CPU寄存器作为变量的空间使用。当然是在满足上面的

三个条件的基础上

3、auto关键字可省略,但register不可省略; 4. register修饰局部变量不可对其做地址运算,如果做了会发生编译错误


6. 请描述extern关键字的作用


7. 请描述const关键字的作用

将变量放在静态存储区


8. const修饰指针类型变量时如何分辨该指针的只读特性

const关键字:含义应理解为只读的变量1.修饰局部变量和形参

该变量和形参的空间仍然在栈区,但栈区没法做成只读,因此:

1>后续代码不可通过变量名去修改它的内容,否则编译出错

2>但可以通过其地址值去修改它的内容,但实际项目中不会这样去用

2.修饰全局变量

全局变量的空间有数据区可读可写段转移到常量段,因此:

1>后续代码不可通过变量名去修改它的内容,否则编译出错

2>也不可以通过其地址值去修改它的内容,否则程序运行时发生段错误

3.const修饰变量定义一定要初始化,否则const关键字不起任何作用

4.const修饰指针时,有两种不同的意义:

1>指针变量自身空间只读的,此时const关键字后应紧跟指针名

2>说明不可以通过该指针变量名去修改其几级指向空间的内容,具体是几级视const与指针名间的*个数而定

const修饰指针时,可以同时出现多个const,每个const的理解分开各自理解即可


章节题目:

结构体相关:
1. 结构体的sizeof运算过程?

对其原则


2. 请描述结构体类型变量定义语句的作用?

  1. 给整个款组分配sizeof(结构体类型*N个字节的空间
  2. 给整个空间命名为数组名
  3. 每sizeof(结构体类)*8个二进制位描述—个结构体类型的元素


3. 请描述结构体类型指针定义语句的作用?

  1. 给该指针变量分配sizeof(结构体类型*)个字节的内存空间
  2. 给该空间命名指针变量名
  3. 该空间使用sizeof(结构体类型*)*8个二进制位描述一个地址值

额外作用:

1>以指针变量自身空间中存放的地址值为首地址的空间(指向空间)中存放的是结构体类型的元素


4. 请描述结构体类型数组定义语句的作用?

  1. 给整个款组分配sizeof(结构体类型*N个字节的空间
  2. 给整个空间命名为数组名
  3. 每sizeof(结构体类)*8个二进制位描述—个结构体类型的元素

额外作用:

1>相当于同时定义了N个结构体类型的变量,这些变量名为数组名[下标]或*(数组名+下标)

2>数组中每个元素即为一个结构体类型的变量。而该元素所在空间相当于同时定义很多个名称为:数组名[下标].成员名((数组名+下标).成员名


5. 已知一个结构体类型变量,访问其成员的方法有几种?


6. 结构体类型作为函数形参类型有什么特点?如何改造其缺点?

可以把多个类型的多个参数打包在一个结构体进行传参,

缺点是会耗费大量的空间和时间,效率低


7. 结构体类型作为函数返回值类型有什么特点?如何改造其缺点?

同上


8. 结构体中成员类型能不能是指针类型?如能则该成员空间存放的是什么?

   可以,指针


9. 如何比较两个同类型结构体变量的大小?

略.


10.请描述深拷贝和浅拷贝的区别?

   浅拷贝是共用一块内存空间,任何一方修改其值,这块内存的就会改变。

   深拷贝是各有各的空间,不会相互影响


预处理相关:
1. 预处理阶段主要做哪些事情?

   1>傻替换

#define ------宏定义宏-----替换规则

#include ----头文件包含

2>条件编译

先判断指定的条件是否成立,决定哪些代码参与下一步的编译,哪些代码不参与下一步的编译(相当于被注释)

3>向下一步源码处理工作(即编译)传递一些参数

这些参数会告诉编译时遇到一些特殊情况时按什么方式处理


2. #include时<>与""的区别

1>指定文件名可以带相对路径(理论上也可以带绝对路径,但是一旦源码所在目录发生改变,则绝对路径也会跟着改变而导致用房路径找不到相应文件)

2>C语言没有明确规则被包含文件必须是.h文件,.c文件或其它文件理论上也是可以,不过项目中99.9%的情况下被包含的是.h文件

3><>首先在操作系统指定目录(Linux系统一般是/usr/include)下查找被包含文件,

然后再到编译器相应选项指定的目录下查找被包含文件(gcc的一个-选项可以指定一个查找被包含文件的路径,n个-l选项可以指定n个路径)"":首先在#include语句所在源文件的同目录(俗称当前目录)下查找被包含文件,

然后在操作系统指定目录(Linux系统—般是/usr/include)下查找被包含文件.

最后再到编译器相应选项指定的目录下查找被包含文件(gce的一个-l选项可以指定一个查找被包含文件的路径,n个-选项可以指定n个路径)

4>项目中一般:

来自于操作系统的头文件和C语言标准库头文件一定用<>来自于其他公司提供的某库头文件---推荐用<>

来自于同一项目其他同事的头文件---推荐用""自己编写的头文件—定用”"


3. 无参宏定义宏体是表达式时应注意什么?

1>替换规则------傻替换,不会先对宏体中表达式做计算然后再替换

2>c语言没有对宏体内容做任何约束,即宏体可以是任意内容(甚至可以为空)

宏体正不正确,看其替换后是否符合c语言语法以及程序员所期望语义(即由下一步编译来检查替换后是否正确)a.宏体为表达式:项目中建议对整个宏体加上0.以避免因运算符优先级带来的理解困扰

b.宏体为语句:项目中建议对整个宏体加上#.以避免因使用处复合语句省去{}带束的理解困扰

c.宏体为空:也被为开关宏,将本宏定义语句注释掉表示关,而将本宏定义语句去掉其作为注释表示开,一般与后续的iHifdef ilfndef球用

d.其它形态:程序员编写时,需要尝试在使用处展开替换,自行判断其是否正确


4. 带参宏定义宏体是表达式时应注意什么?

(1)带参数的宏定义的<宏体>应写在一行上,如果需要写在多行上时,在每行结束时,使用续行符 "\"结束,并在该符号后按下回车键,最后一行除外。

(2)在书写带参数的宏定义时,<宏名>与左括号之间不能出现空格,否则空格右边的部分都作为宏体。

1>替换规则----两轮傻替换:首先将后续代码中宏名(宏实参列表)的写法替换为整个宏体―然后再将宏体所有参数名宇替换为对应的实参写法

2>c语言没有对宏体内容做任何约束。即宏体可以是任意内容(甚至可以为空)

宏体正不正确,看其替换后是否符合C语言语法以及程序员所期望语义(即由下一步编译来检查替换后是否正确)

a.宏体为表达式:项目中建议对整个宏体加上(的同时将宏体中每个宏参名也加上O.以避免因运算符优先级带来的理解困扰

b.宏体为语句:项目中建议对整个宏体加上队以避免因使用处复合语句省去|)带来的理解困扰,同时也要将宏体中每个宏参名加上O,以免因运算符优先级带来的理解困扰c宏体为空:也被为开关宏,将本宏定义语句注释掉表示关,而将本宏定义语句去掉具作为注释表示开,一般与后续的#ifdef tifndef联用

d.其它形态:程序员编写时,需要尝试在使用处展开替换,自行判断其是否正确


5. 请描述宏名的作用域

1>作用域:宏定义语句所在行到当前.c文件尾

2>链接性:无链接性

3>可以提前结束宏名的作用域:

#undef 宏名


6. 条件编译时如果指定条件不成立,则对应源码会不会被执行?为什么?

不会,因为在编译阶段不成立的部分不会被编译进运行程序中


7. 头文件的作用是什么?哪些内容可以写进头文件?

是代码模块化,试代码起看来更简洁,减少重复书写,有更好的可移植性


8. 如何防止头文件被重复包含?

   略

章节题目 ---17章:
1. 请描述二级指针定义语句的作用

  1. 数组名
  2. 空间
  3. 首地址
  4. 类型


2. 请描述三级指针定义语句的作用

  1. 数组名
  2. 空间
  3. 首地址
  4. 类型


3. 请描述数组指针定义语句的作用 

  1. 数组名
  2. 空间
  3. 首地址
  4. 类型


4. 请描述函数指针定义语句的作用

  1. 函数指针名
  2. 空间
  3. 首地址
  4. 返回值类型
  5. 函数参数类型和个数


5. 如何理解复杂的变量定义语句?如:int (*parr[5])(void *,float)

   先左在右再左再在右,直到最后


6. 什么情况必须要用函数指针?

   先要根据条件给函数指针付首地址,然后还有给参数赋值,才能执行的情况下,必须用二级指针


7. 什么类型的数组作为函数形参类型等价于三级指针?

   三维数组的数组名


8. 什么类型的数组作为函数形参类型等价于指向N维数组的数组指针?

N+1维数组类型

章节题目:
1. 请描述使用标准IO函数操作文件的代码基本模板

FILE *pf = NULL;

pf = fopen("./test.txt","r");

if(NULL == pf)

{

    //出错处理

    //失败原因:1. 对于r方式(“r”或“r+”)打开,可能是文件不存在,也可能是没有读权限

    //         2.对于w或a方式打开,可能是外存空间不足或可能是对应目录没有写权限,也可能是没有写权限

}

/*

       文本文件的读写函数:fgetc fputc  fgets fputs fprintf fscanf

       非文本文件的读写函数:fread fwrite

       位置指示器的操作函数:fseek ftell

*/

fclose(pf);

pf = NULL;


2. 请描述使用系统IO函数操作普通文件的代码基本模板

       int open(const char *pathname,int flag)

int open(const char *pathname,int flag,mode_t mode)

lseek(fd,0,SEEK_CUR)

ftell


3. 请描述读取目录文件内容的代码基本模板

#include <sys/types.h>

#include <dirent.h>

#include <stdio.h>

#include <unistd.h>

int main(int argc , char* argv[])

{

    DIR * dir;

    struct dirent * ptr;

    int i;

    dir = opendir("/etc/update-motd.d");

    while((ptr = readdir(dir)) != NULL)

    {

        printf("d_name : %s\n", ptr->d_name);

    }

    closedir(dir);

    return 0;

}


4. 标准IO支持哪三种缓冲方式,标准输入与输出采用、普通文件、标准错误分别采用的是哪种缓冲方式

关于标准IO支持三种缓冲方式:

       1>行缓冲:缓冲区中碰到换行才去操作外存

       2>全缓冲:缓冲区满才去操作外存

       3>不缓冲:缓冲区不起作用,直接操作外存

默认情兄下:

标准输入文件、标准输出文件:行缓冲

普通文件:全缓冲

标准错误文件:不缓冲


5. 请描述fseek和ftell以及lseek函数的功能

  1. 只改不查
  2. 只查不改
  3. 可查可改


6. Linux支持哪7种文件?

       Linux操作系统支持7类文件:

1.普通文件-----一般人非常所说的文件,有文件内容,文件内容表示一些相关信息    open、close、read、write、Iseek

2目录文件-----文件夹、目录,有文件内容,其内容是该目录下文件、子目录的信息opendir closedir readdir

3.链接文件------软链接:类似于windows下的快捷方式,有文件内容,其内容是指向文件的路径   symlink/link

                                   硬链接:文件的别名机制

4.管道文件------无文件内容,用文件名来给某个通信管道命名open close read write mkfifo pipe

5.字符设备文件-----无文件内容,用文件名来给某个字符设备命名open、close、read、write, ioctl

6.块设备文件-----无文件内容,用文件名来给某个块设备命名分区、格式化

7.本地socket文件----无文件内容,本地socket通信时,用文件名作为服务端或客户端的地址       bind accept connect read write close

对7类文件均可以进行的操作函数:access、stat、unlink

对文件描述符属性操作的函数:fcntl

这些函数的核心实现均由操作系统内核提供,因此称为系统lO


7. 请描述stat和access函数的功能

int fstat(int fildes, struct stat *buf);

int stat(const char *path, struct stat *buf); ----- 掌握(重点)

int lstat(const char *path, struct stat *buf);

功能:读取指定文件或目录的状态信息即元信息

返回:执行成功则返回0,失败返回 < 0

参数:

       fildes:与指定文件关联的文件描述符

       path:通过路径名加文件名来指定文件

       buf:用于保存指定文件的元信息

int access(const char *pathname, int mode);(重点)

功能:测试当前用户对指定文件的访问权限

返回:执行成功则返回0,失败返回<0

参数:

       pathname:带路径的文件名或目录名

       mode:指定所要测试的权限

              R_OK 测试读权限

              W_OK 测试写权限

              X_OK 测试执行权限

              F_OK 测试文件是否存在

              可位或上述常量,同时进行测试


8. 硬链接和软链接的有何区别

       硬连接被删就没了;软连接删除不会影响文件,就像快捷方式一样


9. 标准IO读写文本文件内容用哪些函数比较方便?对于非文本文件又如何读写?

       文本文件读写的函数: fgetc fputc fgets fputs fscanf fprintf

非文本文件读写的函数: fread fwrite


10. 请描述标准IO和系统IO之间的关系

标准IO:文件的IO操作函数来自于C语言标准函数库

系统IO:文件的IO操作函数来自于操作系统内核

项目中:对于普通文件多数选择用标准IO函数

对于Linux下的特殊文件选择用系统IO


11. 什么是文件描述符?

文件描述符:

操作系统在程序调用open函数时,会创建一个操作对应文件引擎对象,为了方便管理这些引擎对象,操作系统会将这些引擎对象的内存首地址填写到一个数组(描述符数组)中(从下标0开始检查对应下标位置的地址是不是NULL,如果是NULL则新引擎对象的地址就填在该位置,并将该位置下标作为open函数的返回值返回)

章节题目:

1. 请描述什么是进程、什么是线程?

       1.二者都是操作系统中参与时间片轮转的任务,均有5个状态

       2.线程无法独立存在,只能隶属于创建它的进程

       3.进程是操作系统分配资源的基本单位,即每个进程才有:内存四区、描述符数组

       4.线程是参与时间片轮转的最小单位,即线程只有自己的栈区、寄存器组,堆、数据区、代码区、描述符数组共用其隶国的进程

       5.安全性上,进程更安全,线程不太安全:一个进程崩溃不会影响其它进程,但一个线程崩溃会导致所隶属的整个进程崩溃

       6.线程占用资源较少,进程占用的资源相对比较多,因此线程被称为轻量级任务,进程被称为重量级任务

2. 请描述任务有哪几种状态?什么情况下任务处于指定状态?

       两个基本状态:

       1.运行态:CPU正在执行其代码的状态

       2.就绪态:任务处于等待时间片的状态三个特殊状态:

              1.睡眼态:—个任务需要满足一定条件才能往后执行后续代码,

              但该条件并不满足,因此需要等待执行条件满足

              任务等待指定条件满足的时间段,其状态为睡眠态(阻塞态)按可唤醒的方式分为:

                     1>深度睡眠:只能被条件满足唤醒

                     2>浅度睡眠:被条件满足唤醒+信号唤醒

       2.暂停态:—个任务由于外部干扰导致任务暂时停止执行(此后还可以恢复执行)

              导致任务暂停或继卖的外部因素与任务的逻辑无任何关系

       3僵死态:一个已退出运行的任务,但其占用资源还未被回收的状态

3. fork后父子进程哪些空间是共享的,哪些是各自的空间?

       代码区,其他三区和标识符

4. 如何避免僵尸进程?

       进程分离

       及时wait回收

5. 如何避免僵尸线程?

       分离线程

       及时pthread_join回收

6. 请描述exit和pthread_exit的区别

       exit结束整个进程,无论出现在那个线程中

       pthread_exit只结束当前线程

7. 如何让线程成为分离的线程

       pthread_detach(pthread_self());   //分离线程

/*初始化属性线程属性*/

pthread_attr_init (&attr);  

pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);  

attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);  

ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);  //没有对比就没有伤害

8. 请描述pthread_cancel函数的功能

       主要功能向线程发送一个终止命令,根据线程属性判断是否终止

       线程是否响应

9. 一个进程被替换后哪些空间会被重置

              内存四区全部重置

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值