文档章节

c语言之内存分配笔记

DannyCoder
 DannyCoder
发布于 08/22 01:40
字数 1004
阅读 11
收藏 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
博文 68
码字总数 36018
作品 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
编程技巧之嵌入式C语言完全学习笔记及案例[图]

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

原创小博客
08/15
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...

ningcaichen66
2017/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

什么是自然语言处理技术

自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计...

本宫没空2
12分钟前
1
0
移动端关闭虚拟键盘

那么document.activeElement.blur()为什么可以阻止虚拟键盘弹出呢?原因是:当你点击input的时候,document.activeElement获得了DOM中被聚焦的元素,也就是你点击的input,而调用.blur()方法...

niuhongxia
12分钟前
1
0
Ubuntu18.04安装RabbitMQ(正确安装)

1、安装erlang 由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang sudo apt-get install erlang-nox 2、安装Rabbitmq 更新源 sudo apt-get update 安装 sudo apt-get ins...

hansonwong
22分钟前
0
0
如何在以太坊开发发行自己的ERC-20数字货币

今天我将向你展示如何在以太坊区块链上开发你自己的加密货币并将其出售!我将向你展示如何使用以太坊智能合约逐步创建自己的ERC-20代币和众筹销售,如何测试智能合约,如何将智能合约部署到以...

geek12345
22分钟前
0
0
Vlock用于有多个用户访问控制台的共享 Linux 系统

当你在共享的系统上工作时,你可能不希望其他用户偷窥你的控制台中看你在做什么。如果是这样,我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统。 ...

linuxprobe16
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部