美文网首页
day_01_数据类型、数组、内存布局

day_01_数据类型、数组、内存布局

作者: 闪客飞飞 | 来源:发表于2021-03-04 16:29 被阅读0次

c与c++

C语言是一门通用计算机编程语言,广泛应用于底层开发。
c语句是面向过程的语言,c++是面向对象的语言,C++对c进行扩展。
c是c++的子集,c++是c的超集,所以大部c语言程序都可以不加修改的拿到c++下使用。

1、基本数据类型

     1.**signed**----有符号,可修饰char、int。Int是默认有符号的。
 2.**unsigned**-----无符号,修饰int 、char
整型 字节 取值范围 占位
int 4 -2,147,483,648 到 2,147,483,647 %d
unsigned int 4 0 到 4,294,967,295 %u
short 2 -32,768 到 32,767 %hd
unsigned short 2 0 到 65,535 %hu
long 4 -2,147,483,648 到 2,147,483,647 %ld
unsigned long 4 0 到 4,294,967,295 %lu
char 1 -128 到 127 %c
unsigned char 1 0 到 255 %c

为了得到某个类型或某个变量在特定平台上的准确大小,使用 sizeof 运算符。

表达式 sizeof(type) 得到对象或类型的存储字节大小。

long int 其实就是长整型 = long 可以省去int
在标准中,规定 int至少和short一样长,long至少和int一样长。

格式化还有:

8进制 %o
16进制 小写: %x 大写:%X
(0x)+16进制前面 %#x

浮点型 字节 精度 占位
float 4 6位小数 %f
double 8 15位小数 %lf
long double 8 19位小数 %Lf

C99标准以前,C语言里面是没有bool,C++里面才有,
C99标准里面定义了bool类型,需要引入头文件stdbool.h
bool类型有只有两个值:true =1 、false=0。
因此实际上bool就是一个int
所以在c/c++中 if 遵循一个规则, 非0为true,非空为true;
NULL 其实也就是被define为了 0

2、格式化

include <stdio.h>

printf、sprintf等
sprintf:将格式化的数据写入第一个参数

char str[100];
sprintf(str, "img/png_%d.png", 1);
printf("%s", str);

//使用 0 补到3个字符
sprintf(str, "img/png_%03d.png", 1);
printf("%s", str);

3、数组与内存布局

数组 : 连续的内存

//java
int[] a

//c
//必须声明时候确定大小
int a[10]  
//或者 直接初始化 
int a[] = {1,2,3}

//大小
printf("%d",sizeof(a)/sizeof(int));

栈内存限制 linux:ulimit -a 查看
但是直接分配这么大不行,因为堆栈可能保存参数,返回地址等等信息

动态内存申请

malloc
没有初始化内存的内容,一般调用函数memset来初始化这部分的内存空间.
calloc
申请内存并将初始化内存数据为NULL.

 ` int *pn = (int*)calloc(10, sizeof(int));`

realloc

 对malloc申请的内存进行大小的调整.
char *a = (char*)malloc(10);
realloc(a,20);

特别的:
alloca
在栈申请内存,因此无需释放.
int *p = (int *)alloca(sizeof(int) * 10);

物理内存
物理内存指通过物理内存条而获得的内存空间

虚拟内存
一种内存管理技术
电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大,则会导致内存消耗殆尽。
虚拟内存技术还会匀出一部分硬盘空间来充当内存使用。

代码段:
存放程序执行代码(cpu要执行的指令)

栈是向低地址扩展数据结构
堆是向高地址扩展数据结构

进程分配内存主要由两个系统调用完成:brk和mmap

  1. brk是将_edata(指带堆位置的指针)往高地址推;
  2. mmap 找一块空闲的虚拟内存。

通过glibc (C标准库)中提供的malloc函数完成内存申请
malloc小于128k的内存,使用brk分配内存,将_edata往高地址推,大于128k则使用mmap


![![内存布局解释.jpg](https://img.haomeiwen.com/i8771417/cae724abc8623b30.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ](https://img.haomeiwen.com/i8771417/ec9b8e5778219e52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

[站外图片上传中...(image-4387ab-1614846532032)]

相关文章

  • day_01_数据类型、数组、内存布局

    c与c++C语言是一门通用计算机编程语言,广泛应用于底层开发。c语句是面向过程的语言,c++是面向对象的语言,C+...

  • NumPy 数组对象

    NumPy 数组对象 数组索引和切片 内存布局 副本和视图 数组创建 数据类型

  • 2019-12-07 LINUX内存布局原理

    C语言最难的地方 内存和指针 接下将学习:数据类型,数组,内存布局,物理内存,虚拟内存 从硬件角度:内存是计算...

  • c初探:数据类型、格式化、数组与指针

    c初探:数据类型、数组、内存布局、指针 C 语言教程-RUNOOB.COM C++ 教程-RUNOOB.COM C...

  • JAVA(5)数组

    数组数组是在内存中存储相同数据类型的连续的空间 声明数组 语法: 数据类型[ ] 数组名;或者 数据类型 数...

  • 第七天

    数组 数组是引用数据类型中的对象数据类型(特殊对象)创建一个数组,也要开辟一个堆内存,堆内存中存储数据对象中的键值...

  • 1.17 初识数组

    数组是引用数据类型中的对象数据类型(特殊对象)创建一个数组,开辟一个堆内存,堆内存中存储数组对象中的键值对let ...

  • 第三天__①

    课时14 数组与方法操作(重点) 数组是一个引用数据类型,我们知道任何一个引用数据类型都可以为其设置多个栈内存内存...

  • C初探:数据类型、数组、内存布局、指针

    windows命令行 (可以不用搭理这里,在Linux玩就行)Windows C/C++编译器: https://...

  • Java数组---栈内存与堆内存的区别(通过数组讲解)

    Java数组 在进入讲解主题“-栈内存与堆内存的区别”之前,先来讲解一下数组,所谓数组,就是若干个相同数据类型的元...

网友评论

      本文标题:day_01_数据类型、数组、内存布局

      本文链接:https://www.haomeiwen.com/subject/kyskqltx.html