C语言
文章平均质量分 77
Y~哈哈哈
这个作者很懒,什么都没留下…
展开
-
malloc底层分配的两种机制
一、sbrk/brk实现 (1)其实brk和sbrk是通过指针来实现的,这种实现方式是在用户申请相对而言比较小的内存时用到的 申请: 假如现在用户想申请8个字节的空间,那么系统就会一次性给用户空间分配128k(其实是132k,但是这个值也不是固定的,如果你申请的稍微较大的时候,内核会给你再分配比这大的空间的,所以说内核要根据用户申请的具体情况来定,这个值并不唯一)个大小的...原创 2019-01-10 20:26:15 · 796 阅读 · 2 评论 -
字符串的使用
字符串的使用1:在字符型数据中,输出字符串用%s,输出单个字符用%c;2:字符数组的赋值:数组不允许整体赋值,必须要单个赋值实现字符数组的拷贝:Void main(char *des, char *src)//des 是目的数组,src是源数组voidMystrcpy1(char*des,char*src)//不用再在形参表中传数组长的是因为字符数组中的’\0’可以作为...原创 2018-03-24 00:22:08 · 633 阅读 · 0 评论 -
结构体
结构体 结构体是由一些相同或者不同类型的数据构成的,是一种由用户自定义的一种数据类型,结构体必须由用户在使用之前自己声明. 结构体的定义格式 可以拿来做类比哦 structstudent//类型名 { //成员变量 intcode; charname[20]; //因为姓名是字符串所以定义一个字符数组 cha...原创 2018-04-12 19:40:12 · 196 阅读 · 0 评论 -
中缀表达式求前缀和后缀的三种方法
一、根据运算符的优先级加括号法举例:中缀表达式求后缀表达式a+b*(c-d)-e/f根据运算符的优先级给表达式加上括号 ((a+(b*(c-d)))-(e/f)) 将最外层的符号先提取到对应括号的右侧:(前缀表达式与之相反,是将运算符移动到对应括号的左侧,不再举例)((a+(b*(c-d)))(e/f))— ) //相对整个表达式来讲 这个减号是最外层...原创 2019-04-10 16:29:41 · 6510 阅读 · 1 评论 -
memcpy函数和strcpy函数
1、memcpy指的是C和C++使用的内存拷贝函数,memcpy函数的功能时从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中函数原型: void *memcpy(void *dest, const void* src, size_t n); //dest和src不一定是数组,任意的可读可写的空间均可 头文件:C中 #include<string.h> ...原创 2019-04-08 18:34:26 · 2382 阅读 · 0 评论 -
C语言中全局变量、局部变量、静态全局变量、静态局部变量
1、从作用域看:1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...原创 2019-04-08 19:55:16 · 2064 阅读 · 0 评论 -
C中静态存储区和动态存储区以及C中需要注意的事项
c语言中需要内存来存放数据。而内存主要分为两类:静态存储区和动态存储区;1.静态存储区分为:只读数据(READONLY DATA)区、以读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。2.动态存储区分为堆和栈。都是程序执行的过程中动态分配的,大小也随之动态变化。从内存管理的实现的角度看来,堆使用的链表实现的,而栈使用的是线性...原创 2019-04-08 20:00:23 · 1371 阅读 · 0 评论 -
内存分区
一、内存到底分几个区?1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变...原创 2019-04-08 20:03:37 · 160 阅读 · 0 评论 -
位段的使用
一.位段的使用 使用位段需注意一下几点: 1)位段的类型只能是int,unsigned int,signed int三种类型,不能是char型或者浮点型; 2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,比如在VC中int是占4个字节,那么最多只能是32位; 3)无名位段不能被访问,但是会占据空间; 4)不能对位段进行取地址操作;...原创 2019-04-09 11:39:56 · 1036 阅读 · 0 评论 -
互斥锁、死锁以及如何预防、避免、检测、解除死锁
一、互斥锁:1、互斥锁基本原理: 互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁在逻辑上绑定(要申请该资源必须先获取锁)。 (1)访问公共资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,以防止其他线程访问该资源;如果该互斥锁处于锁定状态,则阻塞当前线程。 (2)只有锁定该互斥锁的进程才能释放该...原创 2019-04-09 11:58:19 · 1630 阅读 · 0 评论 -
const 的使用
Const的用法const有四个作用,下面我们分别介绍:作用1:定义常变量 (常变量的值不会被改变) const int a = 10; 在这样的定义中a 只能可读,不可写也就是说它的值是不能被改变的,可读就是它只能做右值不能做左值,右值就是指在赋值符号‘=’的右边,顾名思义左值就是在‘=’的左边了,接下来由具体的实例来说明:intmain( ){inta ...原创 2018-03-23 23:12:06 · 666 阅读 · 0 评论 -
指针算数运算
指针的算术用算一、指针加1有三种情况:1、加一个字节int main(){int arr[10] = {1,2,3,4,5,6,7,8,9,10};int *p = arr;*p = 10;//由于arr[0]占4个字节,所以字节分别为100 101 10...原创 2018-03-18 16:01:05 · 489 阅读 · 0 评论 -
位运算
一、运算符:(1)“&”:0跟任何数字与的时候都是0,1和某位与的时候不改变它(2)“|”: 0跟任何数字或的时候不变,1和数字或的时候把它变成1(3)“^” :0跟某位异或不改变,1和某位异或的时候取反(4)“>>”:最右边的位被抛弃(以1个字节为例说) 正数:最左边添0;00001010>>3=00000001;...原创 2019-03-30 18:21:42 · 876 阅读 · 0 评论 -
sizeof和strlen的区别
一、strlen计算字符串的实际长度,以'\0'为结束标志,不包含'\0'char *p = "asdvb";strlen(p) = 5;sizeof(p) = 4;(是指针所占的字节大小)(32位系统)二、sizeofsizeof()是运算符,由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数...原创 2019-03-17 15:35:50 · 153 阅读 · 0 评论 -
判断栈的增长方向以及为什么栈从高到低长,堆从低到高长
一、解决方案: 设计两个函数,一个作为调用方(main函数),另一个作为被调用方(fun函数)。被调用方以一个地址(也就是指针)作为自己的入口参数,调用方传入的地址是自己的一个局部变量的地址,然后,被调用方比较这个地址和自己的一个局部变量地址,由此确定栈的增长方向。void function(int *p) { int b = 3,c = 0; printf("address...原创 2019-03-17 15:57:02 · 3686 阅读 · 0 评论 -
素数
C:#include<stdio.h>#include<math.h>int main(){ int j = 2; int i = 200; while(i <= 300) { j = 2; while(j<sqrt(double(i)) && i %j != 0) { j++; } if(j...原创 2019-03-30 18:20:58 · 115 阅读 · 0 评论 -
BF算法
BF算法:是一种比较简单的字符串匹配算法,在处理简单的数据时候就可以用,完全匹配,速度很慢,时间复杂度最坏情况O(m*n)(m,n分别为2个字符串的长度)算法的思想:定义两个整型变量,i,j,i是用来遍历S串的,j是用来遍历P串的,两个整形变量同时从0位置开始走,如果i、j位置对应的值匹配,那么 i++,j++,否则,i 回退到 i = i -j +1位置,j 回退到0位置时间复杂...原创 2019-03-30 18:22:35 · 2147 阅读 · 0 评论 -
进制的计算方法
进制的计算方法通过两个例题来看解决进制的计算方法1、求在几进制下15*4 = 112 A:6 B:7 C:8 D:9假设是在x进制下得到得;即 (x+5)*4 = x^2+x +2两边对x进行取模运算20%x= 2 (1) //这里右边继续写2是因为原式等号右边是112所以肯是大于2进制得那么2对x取模余数还是...原创 2019-03-30 18:22:51 · 6941 阅读 · 0 评论 -
整数类型的数据的逐个输出
对于一个整型数据来说要想逐个输出就要与10以及该整数除以10以后到底是取余数还是取商联系起来下面通过具体事例来解释:将整型数据a = 1234按逆序输出:解题步骤:1、用函数名为Digit的函数用count++计数求出a的位数2、PrintfReverse(intm)通过调用Digit函数通过for循环取模运算然后去尾输出所谓的去尾就是输出末位(m%10...原创 2019-03-30 18:22:22 · 511 阅读 · 0 评论 -
野指针的四大问法
一、什么是野指针 野指针是指向不可用内存区域的指针二、如何产生野指针(1)指针变量没有初始化。任何指针变量刚被创建的时候不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存(2)指针p被free或者delete之后,没有设置为NULL,让人误以为p是个合法的指针。free和delete...原创 2019-03-30 17:35:29 · 372 阅读 · 0 评论 -
数组和指针
数组和指针 首先我们说的是数组,在定义数组的时候我们要注意数组的初始化和给数组赋值,下面由具体的实例说明 /*//一维数组的定义 int main() { int a = 10; int arr[10] = {1,2,3,4,5,6,7,8,9,10};//这是定义了一个长度为10的数组并且给该数组初始化,即arr[0]一直到arr[9]的值分别为1,2,3,4,5,...原创 2018-03-16 15:34:37 · 183 阅读 · 0 评论 -
二进制中1的个数——使用过滤器
例:求解 a = 1001 0011一、在做这种题之前我们要知道 & 按位与这个符号,1 与上任何数都不变,0与上任何数都变为0 在32位机器上 我们将过滤器设置以下几种两位两位一组(一个1),共16对 01 01 01 01 01 .... int m_1= 0x55555555 四位四位一组(两...原创 2019-04-21 16:47:12 · 238 阅读 · 0 评论