![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言基础&面试常见问题
喝橙汁的嗷大喵
talk is cheap,show me the code
展开
-
单链表常见操作
单链表的翻转,找倒数第K个节点typedef struct ListNode_t{ int value; struct ListNode_t *next;}ListNode;/*找到链表倒数第K个节点*/ListNode* find_kth_to_tail(ListNode* pListHead, unsigned int k){ if((NULL == pListHead) || (0 == k)) { return NULL;原创 2020-11-08 09:55:40 · 701 阅读 · 0 评论 -
快速排序实现
快速排序的C语言实现:递归法void quick_sort(int a[],int low,int high){ if(low >= high) { return; } int i = low; int j = high; int key = a[i]; while(i < j) { while((i < j) && (a[j] >= key)) { j--; } if(i < j) a[i++] = a[原创 2020-11-07 22:28:19 · 532 阅读 · 0 评论 -
str&mem系列函数的实现
常见的str及mem系列函数的实现/*由src所指内存区域复制count个字节到dst所指内存区域,如果目标区域和源区域有重叠的话memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同*/void* my_memmove(void* dst, const void* src, size_t count){ if((NULL == dst) || (NULL == src)) { pri原创 2020-11-07 22:22:02 · 471 阅读 · 0 评论 -
经典C语言面试题14:memcpy使用注意事项
memcpy函数原型如下:void *memcpy(void *dst, const void *src, size_t n)功能:用来拷贝src所指的内存内容前n个字节到dst所指的内存地址上。使用时应当注意以下几点:1、如果复制的字节数n超出了dst的空间容量,或者n超出src的容量,此函数是不会进行判断的,这样就很危险。因此,需要程序员自己检查是否有溢出的情况出现。2、...原创 2019-08-11 12:14:32 · 2978 阅读 · 0 评论 -
经典C语言面试题13:#define与typedef的区别
一、简介1、#define #define为C语言中的预处理指令,不仅可以为类型取别名,还可以定义常量、变量、编译开关等。2、typedef typedef用来给已有的类型起一个别名,主要作用如下:① 简化复杂的类型声明,如typedef bool (* FunPtr) (int, double); //声明了一个返回bool类型并带有两个形参的函数指针类型F...原创 2019-08-10 17:59:11 · 2996 阅读 · 0 评论 -
经典C语言面试题12:C语言字符串与字符数组
在C语言中,将字符串作为字符数组来处理。C语言规定了一个“字符串结束标志”,以字符‘\0’代表。也就是说,在遇到第一个‘\0’字符时,表示字符串结束,由它前面的字符组成字符串。 一、字符数组 用字符串常量来初始化字符数组,例如:/* 例1 */char str[] = {"I am happy"}; //也可以省略花括号char str[] = "I am h...原创 2019-08-10 17:22:41 · 3308 阅读 · 0 评论 -
经典C语言面试题11:程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack):由系统自动分配和释放,存放函数的参数值,局部变量的值等。2、堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由系统回收。3、全局区/静态区(static):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域;未初始化的全 局变量和未初始化的静态变量在相邻的另一...原创 2019-08-10 16:22:25 · 2459 阅读 · 0 评论 -
经典C语言面试题10:堆和栈的区别与联系
1、申请方式栈(stack)由系统自动分配。例如,在函数中声明一个局部变量:int b;系统会自动在栈中为b开辟内存空间。堆(heap)需要程序员自己申请,并指明大小。例如,在C语言中的malloc函数:char *p = NULL;p = (char *)malloc(10);在C++中的new运算符p = new char[10];2、申请后的系...原创 2019-08-04 18:32:34 · 3233 阅读 · 0 评论 -
经典C语言面试题9:自旋锁和信号量的区别
一、概念简介1、自旋锁 自旋锁是专门为防止多处理器并发而引入的一种锁,主要用于对称多处理器(SMP)环境中,在内核中大量用于中断处理等部分。自旋锁最多只能被一个内核任务持有,若一个内核任务试图请求一个已被争用的自旋锁,那么这个任务就会一直进行忙循环——>旋转——>等待锁重新可用。若锁未被争用,请求它的内核任务便能立刻得到它并且继续执行。自旋锁可以在任何时刻防止多于一个的内...原创 2019-08-04 17:59:21 · 2593 阅读 · 0 评论 -
经典C语言面试题8:sizeof与strlen的区别
一、基本定义1、sizeof是C/C++中的一个运算符,其作用是返回一个对象或者类型在内存中所占用的字节数。 注意:sizeof后面如果是类型则必须加括号,如 sizeof(char);而如果是变量名则可以不加括号,如 sizeof a; 但是建议使用时 均加上括号。sizeof不能返回动态地被分配的数组的大小。2、strlen是C语言中的库函数,所在头文件为#include <st...原创 2018-05-27 18:52:37 · 9311 阅读 · 2 评论 -
经典C语言面试题7:const关键字的作用
一、const关键字简介 const是单词constant的简写,若一个变量前用const修饰,就意味着该变量里的数据可以被访但不能被修改,即该变量是“只读”的。二、const关键字的用法 1. 用于修饰局部变量 例如:const int n = 5;int const n = 5;/*二者是等价的,均表示变量n的值不能被改变了*/ 注意:在使用const修...原创 2018-05-27 18:05:33 · 3988 阅读 · 0 评论 -
Linux下GDB调试常用命令介绍
一、GDB是啥? GDB是GUN开源组织所发布的一个强大的UNIX下的程序调试工具。可能我们都比较喜欢像VC、BCB及IDE等图形化界面方式的调试工具。但是,如果是在UNIX下开发软件,就不得不提GDB调试工具,因为它具有比上述图形化调试工具更强大的功能,如修复网络断点及恢复链接等。二、GDB有啥用? 一般来说,GDB可以帮助我们完成下面四点功能: 启动程序,可以按照自定义的要求...原创 2018-05-27 11:19:04 · 1540 阅读 · 0 评论 -
经典C语言面试题4:字节对齐的作用
一、什么是字节对齐? 在现代计算机中,内存空间都是按照字节(byte)划分的。从理论上讲对任何类型的变量的访问可以从任何地址开始,但实际情况是,访问特定类型的变量的时候经常在特定的内存地址访问,这就需要各种类型的数据按照一定规则在空间上排列,而不是顺序地一个接一个地排放,这种所谓的规则就是字节对齐。这么长一段话的意思是说:字节对齐可以提升存取效率,也就是用空间换时间。例如:struc...原创 2018-04-21 22:19:59 · 8808 阅读 · 3 评论 -
经典C语言面试题6:进程与线程的关系和区别
一、定义进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程:是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可以和同属于一个进程的其他线程共享进程所拥有的的全部资源。二、关系和区别一个线程可以创建和撤销另一个线程;同一个进程中的多个...原创 2018-04-22 15:24:18 · 6876 阅读 · 0 评论 -
经典C语言面试题5:大端(big endian)与小端(little endian)的区别?
一、大端与小端的名字由来在乔纳森·斯威夫特的著名讽刺小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧。(ps:名字由来真草率!)二、概念大端模式(big endian):数据的高位字节保存在内存的低地址中,而低位字节...原创 2018-04-22 10:53:47 · 3240 阅读 · 1 评论 -
经典C语言面试题3:位域。
1、为什么要用位域? 在计算机中,有些信息存储时并不需要占用一个完整的字节,而只需占用一个或几个二进制位。比如在存放一个只有0和1两种状态的开关量时,用一位二进制位即可表示。因此,为了节省存储空间,C语言提供了一种称为“位域”的数据结构来充分利用存储空间。 位域的主要实现方式:把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数,每个域有一个域名,允许在程序中按域名进行操...原创 2018-04-01 17:51:58 · 2354 阅读 · 0 评论 -
经典C语言面试题2:static关键字的用法?
C语言中static关键字的用法主要有以下三种:1、在函数体内,static变量的作用范围为该函数体,该变量的内存只能被分配一次,下次调用时维持上次的值(即具有记忆功能)。2、在模块内的static全局变量可以被模块内的所有函数访问,但是不能被模块外的函数访问(注:即使在模块外的函数中加extern也不行)。3、在模块内的static函数只可以被模块内其他函数调用,此函数的作用域被限制在声明它的模...原创 2018-04-01 16:36:51 · 2853 阅读 · 0 评论 -
经典C语言面试题1:malloc 和 new的区别?
①、malloc/ free是 C++/C语言的标准库函数,而new/ delete是C++的运算符。②、malloc内存分配成功返回的类型为void*,需要通过强制类型转换将void*转换为我们需要的类型。③、new内存分配失败时会抛出bac_alloc异常,不会返回NULL;而malloc分配失败时则返回NULL。④、使用new操作符申请内存分配是无需指定内存块的大小,而malloc则需要显式...原创 2018-04-01 12:48:28 · 2507 阅读 · 0 评论 -
C语言编译过程
C语言编译过程为:预处理-->编译-->汇编-->链接1、预处理(Pre-processing) 对源程序中的伪指令(以#开头的指令)和特殊符号进行处理。伪指令包括:宏定义指令、条件编译指令、头文件包含指令。2、编译(Compiling) 将源程序转换为计算机可以执行的二进制代码。 说明:在linux下,目录文件的缺省后缀为 .o 编译程序将通过...原创 2018-04-01 12:14:06 · 1916 阅读 · 0 评论