笔试/面试题总结
文章平均质量分 81
qicheng777
这个作者很懒,什么都没留下…
展开
-
内存管理几个程序实例
一、Test 函数的语句 GetMemory(str, 200)并没有使 str 获得期望的内存, str 依旧是 NULL,为什么?void GetMemory(char *p, int num){ p = (char *)malloc(sizeof(char) * num);}void Test(void){ char *str = NULL; GetMemory原创 2017-06-20 22:33:09 · 328 阅读 · 0 评论 -
锁、PV操作、进程互斥与同步的实现
什么是临界区? 每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。 一、锁机制:1、锁:在多线程编程中,操作系统引入了锁机制。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。加锁过程用如下伪码表示: 1、read loc原创 2017-08-20 21:25:18 · 21662 阅读 · 4 评论 -
二叉树的基本操作
一、树:树 :一种非线性数据结构树的应用:操作系统中:用树表示文件目录组织结构编译系统中: 用树表示源程序语法结构 相关概念常见表示方法:树有且仅有一个根节点树的结构定义是一个递归的定义树可以看做一个集合,每个集合下面又有很多子集合,所以单节点与子树之间可以表示为 T={跟结点,左孩子,右孩子} -实例:T1 ={A,B,C}当然,树还可以用括号表示,这样更加容易看上图可表示为:(A原创 2017-08-05 15:05:53 · 696 阅读 · 0 评论 -
结构体对齐(图解)与位域
一、结构体对齐 在计算结构体大时往往需要考虑到结构体对齐,简单的总结下我的一些经验。 结构体对齐时,先找出本结构中最大类型的长度,先考虑自身对齐,然后在与最大类型对齐,最后考虑整个结构对齐(与最大类型长度对齐),下面用图解法进行分析:例:(64位系统,模数最大为8,所以结构体最大对齐值为8 ; 32位系统为模数为4,结构体对齐值为4)#include <stdio.h>struct A{原创 2017-09-04 14:36:11 · 6542 阅读 · 3 评论 -
进程状态(含状态变迁图)
一、三态模型:三态模型:在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化。进程一般有3种基本状态:运行、就绪和阻塞。(1)就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。(2)运转载 2017-08-20 10:49:31 · 23672 阅读 · 1 评论 -
排序算法——桶排序、冒泡排序、快速排序、选择排序
一、桶排序:最快最简单的算法,但是因为要借助辅助内存(数组),所以占用空间,如果要对很多数据排序就不太合适。 一个旗子表示该数出现过一次。#include <stdio.h>int main(){ int book[1001],i,j,t,n; for(i=0;i<=1000;i++) { book[i]=0; } scanf("%d"原创 2017-07-27 20:33:17 · 1648 阅读 · 0 评论 -
常见字符串函数的实现过程
一、strlen()函数求字符串长度,不包括 ‘\0’unsigned int mystrlen( char *s ){ unsigned int len=0; while(*s != '\0') { s++; len++; } return len;}二、字符串追加函数strcat( ):char *mystrcat(ch原创 2017-07-30 20:55:56 · 481 阅读 · 0 评论 -
二分查找法(递归与非递归方式)
思想: 首先要确保数组中数是按顺序排列好的,假设我们要查找的数为277。要查找的数277:比较277与中间数的大小,如果刚好为277,则就算找到。如果大于277,排除另外一半,然后把新的half_num-1设置为上界。同理,如果小于277,则把half_num+1设置为下界 。然后继续重复之前的步骤。一、非递归#include <stdio.h>void create_num(i原创 2017-08-10 21:34:54 · 719 阅读 · 0 评论 -
C语言内存四大区域几点总结
未初始化全局变量默认值为0,未初始化局部变量一般默认值为随机数,但有的编译器也为0。一、栈: 栈遵循后进先出,栈的大小由编译器决定。一般来说,默认栈的大小为1M,所以如果变量分配内存过大可能会造成栈溢出。比如: 定义一个数组长度为200M,double a[1024*1024*200]如果编译器栈大小不够的话会造成溢出。栈不同于堆,栈用完立即回收,所有局部变量都存放在栈中。 如下程序会一直进原创 2017-07-26 19:58:02 · 1121 阅读 · 1 评论 -
单向链表的基本操作
一、链表与数组: 首先,我们来看看为啥我们有了数组,还需要链表呢?那么我们来看看链表与数组的区别。二者都属于一种数据结构: 从逻辑结构来看:1、 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。2、 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据原创 2017-08-02 16:53:53 · 685 阅读 · 0 评论 -
递归与栈
登斯楼也,则有去国怀乡,忧谗畏讥,满目萧然,感极而悲者也。 ——《岳阳楼记》一、递归: 简单来说,递归就是自己调用自己,然后一层一层的返回。 所有for循环都可以用递归来做。废话不多说,直接上例题:1、实例1: 50个台阶,一次只能走一步或者两步,问有多少方法到达第10个台阶? 解决这个方法,我们首先要找到数学规律: f(1原创 2017-07-25 10:30:13 · 3268 阅读 · 0 评论 -
C语言经典编程题
一、递归求一个数的阶乘:int factorial(int n){ while (n > 1) { return n*func(n-1); }}当然也可以不用while循环,因为都是n级运算,算法复杂度都为O(n),所以影响不大。int factorial(int n){ if(n == 0) { return 1;原创 2017-08-11 20:21:53 · 50653 阅读 · 6 评论