自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 进程地址空间

把物理地址暴露给外部是一件非常危险的事情,因此采用虚拟内存作为线性地址与物理地址的中间层。32位地址总线保存0x00000000到0xffffffff所有的地址,转换为二进制就是32个0到32个1,也就是2^32 = 4G,因此虚拟内存大小为4G,其布局如下图所示:一个可执行文件在运行时被装载到虚拟内存,那么他是怎么装载的呢?首先,每个进程都有一个PCB(进程描述符)来描述这个进程的状...

2019-01-15 16:21:19 456

原创 关于引用

看过很多博客说引用是不开辟内存的,但经过实践,这一说法太过于表面。我通过代码转到反汇编,发现有开辟形参压栈的过程:#include <iostream>int sum(int& a,int& b){ return a+b;}int main(){ int a = 10; int b = 20; int s = sum(a,b); std...

2018-12-01 21:29:11 190

原创 静态链表

     静态链表依靠数组来实现链表的功能,他在物理上是顺序存储的:如上图所示为一个静态链表,图示红色区域不作为有效存储单位,其余的未使用的单位简称为备用链表。资源是要被利用起来的,所以:1).最左边的红色单位用来存储备用链表的第一个单位的下标,我们可以简单理解为它是备用链表的头节点;2).最右边单位指向已使用链表。因为数组下表递增的特性,我们规定自左往右赋值即为链表头插,...

2018-12-01 20:42:41 215

原创 函数堆栈调用过程及总结(待完善)

为了解函数调用的底层实现机制,通过visual studio 2010及一段代码来剖析,代码如下:1. #include <stdio.h> 2. 3. int GetSum(int a,int b) 4. { 5. return a+b; 6. } 7. 8. int main() 9. { 10. int a = 10;...

2018-11-17 20:30:12 374

原创 虚拟地址空间布局和编译链接运行原理

一、利用中间层访问物理内存,一是提高了内存使用效率和最优分配,二是提高了安全性。中间层又被称作虚拟地址空间,由此一来,程序访问的不再是实际的物理内存地址,而是访问虚拟地址,操作系统再将虚拟地址映射到物理内存上;linux系统下虚拟地址空间是这样划分的:.data段和.bss段统称为数据段,不同之处为:.data段存放已初始化且初始化不为0的数据.bss段存放未初始化或初始化为0...

2018-11-17 20:23:31 448

原创 指针被强转为数字的应用

有如下程序:#include <stdio.h>int main(){ int arr[]={2,3,2,3}; int *p2=(int *)((int)arr+1); //arr被强转为int型数字,加上1,现在arr为首元素地址加1个字节 printf("%x\n",*p2); return 0;}在强转前,arr指向如下所示:强转后,arr指向如下所示...

2018-05-16 14:38:40 1350

原创 判断结构体大小的方法

1.创建一个结构体类型:typedef struct A{ char a; int b;}A;Char类型占1个字节,int占4个,所以容易误判为struct A占五个字节。假如计算机是按照这个来在内存中存储数据:上方的数字代表了地址,每个格子代表一个字节;计算机是寻址访问数据的,在访问变量b时,它的首地址要能被4整除,才能被访问,以前这样存放是可以的,但是在如今内存很大的时代下,以这样的...

2018-05-05 18:02:04 3374 1

原创 略谈typedef

假如定义十个甚至更多这样类型的变量:unsigned long long int a;不停地写变量类型是一件很麻烦的事,极大地降低工作效率,typedef的存在就是解决这个问题!顾名思义,typedef就是:类型定义,给类型起别名。假如要定义一个无符号长长整型类型,用uint64来当做这个类型的别名,这时uint64就是这个类型本身,只需这样做:typedef unsigned long long...

2018-04-29 12:42:35 160

原创 魔方阵(奇数阶、单偶数阶、双偶数阶)

#include <stdio.h>#include <assert.h>#include <stdlib.h>int **Magic1(int n) //奇数阶魔方阵{ assert(n%2 != 0); int **arr = (int **)malloc(sizeof(int *)*n); //创建二维数组存放魔方阵 for(...

2018-04-26 20:13:28 6634

原创 free()崩溃原因总结

       在使用动态内存分配malloc()后,若不及时释放内存free(),会造成内存泄漏;我总结了在释放时经常出现错误的原因,频率由高到低排序。(一) 越界、漏写sizeof()、realloc()第二个参数写错int main(){ int *arr=(int *)malloc(10*sizeof(int)); //分配10个单位的连续块,每个单位4个字节 //for(int ...

2018-04-22 23:37:58 10630

原创 递归详解

用如下程序来解释递归:#include <stdio.h>int Sum(int n) //从1~n相加{ return n == 1 ? 1:Sum(n-1)+n;}int main(){ printf("%d\n",Sum(4)); return 0;}程序从main开始执行,当执行Sum(4)时的情况如下图所示:Sum(4)执行到最底下层虚线处,即re...

2018-04-19 22:56:13 167

原创 strlen.strcpy.strcmp.stratoi.stritoa的自己实现

#include <stdio.h>#include <string.h>//1.字符串连接char * Mystrcpy(char *des,const char *src,char *p){ while(*p++ = *src++); //指针p指向des的'\0'位置,从此处开始复制,即实现了字符串连接 return des;}//2.字...

2018-04-16 23:02:08 127

原创 Const(定义常变量)的四个重要性质

1.将变量变成只读 定义一个变量a,并赋初值10,变量a既可以被重新赋值,又可以被读取:int a= 10;a = 20;int b = a;这时变量a被称为左值,它具有可以被赋值和读取两种属性倘若定义常变量a,试着重新赋值和读取:可以看到编译器报错,const将变量a变成了右值,即只可被读取,不能写入(重新赋值)2. 数据类型对于const而言是透明的观察1,const写在int后面,那么...

2018-04-16 22:43:40 3177

原创 字符串常量高频错误

当定义一个字符串常量:char *arr = "aecd";发现”aecd”的’b’错写成了’e’,当试图去更改的时候,程序会崩溃:char *arr = "aecd";arr[1] = 'b';这是因为字符串常量存储在常量区(静态存储区),这部分区域是不允许修改的,而指针arr指向的是”aecd”的地址,并不是这个值,如下所示:字符数组的值可以修改,例如:char arr[] = "aecd...

2018-04-16 21:40:08 306

原创 假设在n进制下,下面的等式成立,567*456 = 150216,n的值是()

问题:假设在n进制下,下面的等式成立,567*456 = 150216,n的值是()          A.9     B.10     C.12       D.18 1. 在六进制下有:15*4=112.    把这个等式转换为十进制:(1*6+ 5*6^0) *(4*6^0)=(1*6^2 + 1*6 + 2*6^0)2. 同理,对567*456=150216做如上变换:    (5*n^2...

2018-04-13 12:22:31 384

原创 C语言:指针学习(二)

主函数调用子函数,子函数的改变要想影响影响主函数,必须:    1:传指针    2:解引用以下有三个案例是指针学习中最容易出现的问题(前提:交换两个变量a、b的值)(一)第一种情况是没有传指针,也没有解引用。#include <stdio.h>void Swap_error1(int a,int b){ int tmp; tmp = a; a = b; b = tmp;...

2018-04-02 23:15:12 476 1

原创 C语言:指针学习(一)

 C语言这门课程里,初次接触到指针这一章节时,对于指针的理解我很模糊,所以就通过程序和调试来加深对指针的理解。Int a = 10;Int *p = &a;1.为了理解p和*p到底代表了什么,调试得到如下结果:可以看到,指针变量p的值和变量a的地址相同,*p等于变量a的值。也就是说,指针等同于一个地址,解引用(*p)为该地址上内存单元存储的的值(a)。在此基础上,又有两个新问题:(1)解...

2018-04-02 17:57:26 3604 2

原创 C语言:关于输入一个正整数的应用

1.求出它是几位数2.分别输出每一位数字3.按逆序输出各位数字,例如原数为123,应输出321#include <stdio.h>int Getnums(int n){ int count = 0; do { n /=10; count++; }while(n != 0); return count;}void Geteachnum(int n){...

2018-03-28 16:14:51 4298

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除