文档章节

c语言之内存分配笔记

DannyCoder
 DannyCoder
发布于 08/22 01:40
字数 1004
阅读 9
收藏 0

先看一个数组:

short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0;

或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组大小只有2个。

数组名array其实是指向的数组的首地址,比如我们可以通过array[1]取出数组的第二个元素,也可以通过指针*(array+1)指向第二个元素取出对应的值。

看完上面数组定义,可以看出数组是必须固定大小的,而且不可以再扩展的特性。

假设一个场景,我们想要往一段内存里写入一堆的int类型的数据,但是大小是不知道的。如果使用数组这儿就不适用了。

还好我们c语言有个函数malloc 和 calloc和realloc函数。可以使用比如:

short* array

array = (short*)malloc( sizeof(int)*30);

//这儿首先开辟了30个int类型的空间,然后把p指向这个空间的位置。在这里的指针是指向第一个int值。并不是我们全部开辟的30个int的空间。这就和数组一样,指向数组的指针式指向数组首元素的地址,并不是整个数组的元素。所以,在这里我们的操作也和数组是一样的。

如果我们要实现动态内存拓展的方式,我们可以使用calloc和realloc。

接下来,我们在认识两个关于内存分配的函数。calloc()函数和realloc()函数。 
calloc()函数与malloc()函数有相同之处,也有相似之处。 
例:

short *p;
newmem=(short *)calloc(1000,sizeof(short)); 

通过这个例子,我们可以知道calloc()函数有两个参数,并且这两个函数都是size_t类型(unsigned int类型)的数。第一个参数在这里所说的是所需要开辟的内存的单元数量,第二个参数是每个单元的字节的大小。

void *calloc(size_t ,size_t);

calloc()函数还有一个特性,它将块中的全部位都置为0。这也是calloc()函数和malloc()函数的区别,calloc()函数和malloc()函数的另外一个区别是他们请求内存数量的方式不一样。当然,free()函数也可以来释放calloc()函数分配的内存。

realloc()函数用来修改一个原先已经分配的内存的大小。使用这个函数,你可以让一块内存增大还是缩小。当扩大时,这块内存原先的内容会依然保留,新增加的添加到原先的后面。缩小时,该内存的尾部部分内存去掉,剩余保留。

注意:对于realloc()函数,如果原先的内存无法修改,这时候realloc()函数再会分配一块内存,并且把原先那块内存的内容复制到上面去。所以,使用了realloc函数以后,你这时候在使用的就该是realloc函数返回的新指针了。当realloc函数的第一个参数是NULL时,这时候我们可以把它当作是malloc()函数。

我们来个例子:

void printChars(){

    int *strs = malloc(sizeof(int)* 255); //使用动态分配内存  创建int类型返回数组
    for (int i = 0; i < 255; i++){
        *(strs+i ) = i + 1; 
    }
    int M = 100; //动态大小
    int *p;
    p = (int*)malloc(sizeof(int)*M);
    int N = 1;
    for (int i = 0; i < 255; i++){
        if (i % 100 == 0 && i!=0){ //达到极限的时候,再次动态扩充整数倍布内存
            p = realloc(p, sizeof(int)*M*(++N));

        }
        *(p + i) = *(strs+i);
    }
    for (int j = 0; j < 255; j++){
        printf("%d " , *(p + j));
    }

}

打印结果:

 

© 著作权归作者所有

共有 人打赏支持
DannyCoder
粉丝 2
博文 62
码字总数 28303
作品 0
广州
程序员
Redis设计与实现系列-基本数据结构-SDC

关于《Redis设计与实现》读书笔记 SDC全称是(simple dynamic string,SDS),Redis是以C语言编写的,但是Redis并没有直接使用C语言内置的字符串(C语言内置的字符串以空格结束),Redis自己构...

申文波
07/30
0
0
Thread Local Storage(TLS)笔记

TLS想要解决的问题 性能 例如从TLS分配内存可以显著提高速度 避免或者减少锁的竞争 正确性。例如errno的设置 TLS在实现时,其实可以不依赖语言的关键字,其实TLS就是把一个数据结构跟线程关联...

Jiang阿涵
07/16
0
0
JNI学习笔记之ndk-build手动编译并集成流程

参考 一天掌握Android JNI本地编程 快速入门 Android开发实践:常用NDK命令行参数 Secrets of Android.mk JNI JNI是啥? JNI(Java Native Interface):Java本地开发接口,JNI是一个协议,用来...

newtrek
2017/11/05
0
0
编程技巧之嵌入式C语言完全学习笔记及案例[图]

编程技巧之嵌入式C语言完全学习笔记及案例[图] 1、经典入门:hello world 1.1、概念: *源文件:源文件即源代码文件,C语言源文件后缀名是.c。 *头文件:头文件后缀名为.h(head,头),C语言...

原创小博客
08/15
0
0
C语言实现数据结构之栈的详解

在函数调用的过程中,需要的就是先进后出的特点,因此,栈就出现了。 栈是一种数据结构,是计算机怎么处理程序运行的一种方式。具有先进后出的特点,下面看的就是这些抽象的数据结构怎么用C...

ningcaichen66
2017/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VSCode 搭建Vue开发环境之Vue CLI

一、简介说明 1.关于VS Code开发工具,安装和配置,更多可以参考以前文章 2.关于Vue.js,Vue是一个优秀的渐进式前端框架,不仅易于上手,还便于与第三方库或既有项目整合。 3.关于Vue是使用方...

tianma3798
32分钟前
2
0
MySQL 相关博客整理

1. 《深入理解 MySQL 底层实现》 简评:文章从硬盘底层存储原理讲解到MySQL存储原理,其中涉及InnoDB 和 Myisam 中 B+Tree 的应用,以及常见数据库优化思路,算是一片很不错的讲解MySQL原理的...

科陆李明
42分钟前
2
0
pada rabbitmq server mangage

查看配置文件 ubuntu@node4:/etc/rabbitmq$ lltotal 28drwxr-xr-x 2 rabbitmq rabbitmq 4096 Jun 6 13:52 ./drwxr-xr-x 104 root root 12288 Sep 26 11:39 ../-rw-r--r-- ......

qwfys
49分钟前
0
0
SpringBoot进阶

慕课网链接 表单数据的验证 在pojo类属性的上面添加注解 @Entitypublic class Girl { @Id @GeneratedValue private Integer id; @NotBlank(message = "这个字段...

踏破铁鞋无觅处
57分钟前
1
0
【SylixOS】QT-QWS流程介绍

QWS简介 QWS(QT Windows System)是QT自行开发的窗口系统,体系结构类似X Windows的C/S结构。QWS Server在物理设备上显示,QWS Client实现界面,两者通过socket进行彼此的通讯。在很多嵌入式系...

suokin
57分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部