动态分配内存

C和指针之动态内存分配

旧街凉风 提交于 2020-02-07 03:06:26
1、为什么使用动态分配内存   当不确定需要的内存空间的大小的时候,使用动态分配内存的方式去分配一块内存,这样不会对内存进行浪费。 2、动态分配内存的函数   C函数库提供了三个动态分配内存的函数:malloc、calloc、realloc,这三个函数都能进行动态的内存分配。当这些内存不再使用时可以用free函数把这些内存归还给内存池,以达到内存释放的目的。 四个函数的函数原型如下: void *malloc(size_t size); void *calloc(size_t num_elements, size_t element_size); void realloc(void *ptr, size_t new_size); void free(void *pointer);   malloc函数的参数就是需要分配的内存字节数。如果内存池中的可用内存可以满足这个需求,malloc就会返回一个指向被分配的内存块起始位置的指针。malloc所分配的内存是一块连续的地址,并不会分开位于两块或多块不同的内存。如果内存池是空的,或者它的可用内存无法满足申请的需求,此时malloc会向操作系统请求得到更多的内存,并在这块新的内存上执行分配任务。如果操作系统无法向malloc提供更多的内存,就会导致malloc分配内存失败,此时malloc会返回一个NULL指针。因此

5分钟看懂什么是 malloc

雨燕双飞 提交于 2020-02-04 22:39:32
关注微信公众号[编程反思录],看更多干货 对你有帮助,请不吝点个赞,点关注不迷路 初识 动态内存分配 [C语言必知必会] 动态内存分配的引入 初学数组的时候,有一个问题经常困扰着我,就是:我们可不可以 自己在程序里定义一个数组的大小 而不是在函数开头先声明一个很大的数组,然后仅仅使用它的一小部分? 请看下面的程序: 我们需要一个大小为 N ( N < 1000)的数组,我们通常这么写: int main ( void ) { int arr [ 1000 ] = { 0 } ; int N = 0 ; int i = 0 ; printf ( "请输入数组的大小\n" ) ; scanf ( "%d" , & N ) ; printf ( "请输入%d个数\n" , N ) ; for ( i = 0 ; i < N ; i ++ ) scanf ( "%d" , & arr [ i ] ) ; return 0 ; } 每次这么写我都觉得自己在绕远路,为什么就不能直接把输入的变量 N 当作数组的大小直接使用? 比如这样: arr[N] ,但是很遗憾,每次编译器都把你扼杀在程序编译之前! C99才可以用变量做数组定义的大小 并且可以在程序中随时声明变量。(C99前我们需要在函数的最前面的区域对所有变量进行声明) 如果我不想用上面那种笨笨的办法,又没有支持C99的编译器,我该怎么办?

c的动态内存管理

房东的猫 提交于 2020-02-02 07:59:51
一、动态内存分配 1、 c语言中动态内存分配的步骤: (1) 用mallocl类的函数分配内存; (2) 用这些内存支持应用程序; (3) 用free函数释放内存 例如: 2、 内存泄露 如果不再使用已分配的内存却没有将其释放,就会发生内存泄露,导致内存泄露的情况可能如下: (1) 丢失内存地址 在上图中,pi重新分配地址,原来指向的地址丢失。 Name指向的初始内存地址丢失 (2) 应该调用free函数却没有调用 对于这种情况,尤其需要注意:指向结构体的情况,如果一个结构体内部有动态指针,在释放结构体指针的时候需要释放结构体内部的动态指针。 3、 动态分配内存函数 (1) malloc函数从堆上分配一块内存,所分配的字节数由该函数唯一的参数指定,返回值是void指针,如果内存不足,就会返回NULL,否则返回首字节地址,新分配的内存包含垃圾数据。 初始化静态或全局变量时不能调用函数,(但是貌似用vs2012 没有报错) (2) 使用calloc分配内存 Calloc会在分配的同时清空内存,清空内存的意思是将其内容置为二进制0.函数的原型是: Calloc函数会根据numElements和elementSize两个参数的乘积分配内存,并返回一个指向内存的第一个字节的地址,如果分配失败,返回NULL。不用calloc的话,用malloc函数和memset函数可以得到同样的结果,如下

C语言动态存储分配

孤街醉人 提交于 2020-01-31 06:09:25
动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串、数组和结构体 本文地址: http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html ,转载请注明源地址。 1、内存分配函数 3种内存分配函数都是声明在<stdlib.h>中: malloc函数--分配内存块,但是不对内存块进行初始化 calloc函数--分配内存块,并且对内存块进行消除 realloc函数--调整先前分配的内存块 malloc函数不需要对分配的内存快进行清除,所以它比calloc函数更高效 当申请内存块而调用内存分配函数的时候,函数会返回void*型的值。内存中对象的空间大小,是以“字节”的数目为单位计算的,许多头文件都定义了size_t类型,专门用来保存这种“内存”空间的相关信息,比如sizeof运算符返回字节的数目,类型是size_t 2、空指针 由于用名NULL的宏来表示空指针,所以常使用下列方式测试malloc函数的返回值: p=malloc(10000); if(p==NULL) { /*分配失败*/ } 在C语言中,指针测试真假的方法和数的测试一样: if(p==NULL) if(

内存动态分配

旧街凉风 提交于 2020-01-31 05:43:07
C库函数malloc,calloc,realloc,free的用法 *此博客仅用来记录博主的C语言学习路程,如果内容有帮到你,那我将感到十分的荣幸* malloc用法 声明: void *malloc(size) 分配所需的内存空间,并返回一个指向它的指针。(空类型,必要时可以转换) 参数(一个) size 内存块的大小,以字节为单位。 案例 ---------用malloc动态创造一个数组 # include <stdio.h> int main ( ) { int num ; printf ( "Please enter a number:__\b\b" ) ; scanf_s ( "%d" , & num ) ; int * p = ( int * ) malloc ( sizeof ( int ) * num ) ; for ( int i = 0 ; i < num ; i ++ ) //按照数组的方式访问 { p [ i ] = i ; printf ( "%3d\n" , p [ i ] ) ; } free ( p ) ; //用完了一定要释放内存 return 0 ; } 解释:以上的代码片用 malloc 函数动态分配了 sizeof(int) * num 个字节,因为malloc函数返回值是一个空指针的类型,所以我在上述代码中将其类型转换成 (int *)

进程、线程、以及它们之间的区别与联系

我的未来我决定 提交于 2020-01-28 15:06:08
一、进程简介 1.1 进程概念的引入 计算机中,CPU是最宝贵的资源,为了提高CPU的利用率,引入了多道程序设计的概念。当内存中多个程序存在时,如果不对人们熟悉的“程序”的概念加以扩充,就无法刻画多个程序共同运行时系统呈现出的特征。 多道程序设计:是指允许多个作业(程序)同时进入计算机系统的内存并启动交替计算的方法。 也就是说,内存中多个相互独立的程序均处于开始和结束之间。 从宏观上看是并行的,多道程序都处于运行过程中,但尚未运行结束; 从微观角度上看是串行的,各道程序轮流的占用CPU交替的执行。 引入多道程序设计技术可以提高CPU的利用率,充分发挥计算机硬部件的并行性。 多道程序系统中,程序具有:并行、制约以及动态的特征。程序概念难以便是和反映系统中的情况,所以引入了进程这一概念。 1.2 程序是什么 说起进程,就不得不说下程序。先看定义:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个 静态 的概念。系统实际上是出于不断变化的状态中,程序不能反映这种动态性。 而进程则是在处理机上的一次执行过程,它是一个 动态 的概念。这个不难理解,其实进程是包含程序的,进程的执行离不开程序,进程中的文本区域就是代码区,也就是程序。 1.3 进程是什么 1.3.1 进程的概念 进程的定义: 进程是据有独立功能的程序在某个数据集合上的一次运行活动

C++中存储区的划分

我是研究僧i 提交于 2020-01-25 20:33:45
一. 在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放 4.另外还有一个专门放常量的地方。- 程序结束释放 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。比如: int a = 0; //全局初始化区 char *p1; //全局未初始化区 void main() { int b; //栈 char s[] = “abc”; //栈 char *p2; //栈 char *p3 = “123456”; //123456{post.content}在常量区,p3在栈上 static int c = 0; //全局(静态)初始化区 p1 = (char *)malloc(10);

关于redis中SDS简单动态字符串

旧时模样 提交于 2020-01-25 04:55:00
1、SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *)。它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制数据。 sds的类型定义 typedef char *sds; 肯定有人感到困惑了,竟然sds就等同于char *? sds和传统的C语言字符串保持类型兼容,因此它们的类型定义是一样的,都是char *,在有些情况下,需要传入一个C语言字符串的地方,也确实可以传入一个sds。 但是sds和char *并不等同,sds是Binary Safe的,它可以存储任意二进制数据,不能像C语言字符串那样以字符’\0’来标识字符串的结束,因此它必然有个长度字段,这个字段在header中 sds的header结构 /* Note: sdshdr5 is never used, we just access the flags byte directly. * However is here to document the layout of type 5 SDS strings. */ struct __attribute__ ((__packed__)) sdshdr5 { unsigned char flags; /* 3 lsb of type, and 5 msb of string

Redis---SDS(简单动态字符串)

喜欢而已 提交于 2020-01-25 04:46:17
   Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。   在 Redis 里面, C 字符串只会作为字符串字面量(string literal), 用在一些无须对字符串值进行修改的地方, 比如打印日志.   当 Redis 需要的不仅仅是一个字符串字面量, 而是一个可以被修改的字符串值时, Redis 就会使用 SDS 来表示字符串值 1.SDS的定义 struct sdshdr { // 记录 buf 数组中已使用字节的数量, 不包括 '\0' 的长度 // 等于 SDS 所保存字符串的长度 int len; // 记录 buf 数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[]; };   buf [ ] 除了保存字符串的字符外, 还会在末尾保存一个 空字符 '\0' , 空字符不计算在 len 属性之中.   遵循空字符结尾的好处是可以重用一部分C字符串的函数. 2.SDS与C字符串的区别 2.1 常数复杂度获取字符串长度   C字符串不记录自身的长度信息, 获取字符串长度时会遍历字节数组, 直到遇到空字符为止. 复杂度为

python模拟实现操作系统动态分区分配与回收

不羁岁月 提交于 2020-01-25 02:42:43
python模拟实现操作系统动态分区分配与回收 首次适应算法,循环首次适应算法,最佳适应算法,最坏适应算法 #!/usr/bin/env python # coding=utf-8 import copy p_sign = None p_num = 0 time = 0 class node ( object ) : def __init__ ( self , start , end , length , state = 1 , ID = 0 ) : self . start = start self . end = end self . length = length self . state = state ##state为1:内存未分配 self . Id = ID ##ID为0是未分配,其余为任务编号 def showList ( list ) : """展示空闲分区""" print ( "空闲分区如下" ) id = 1 for i in range ( 0 , len ( list ) ) : p = list [ i ] if p . state == 1 : print ( id , ' :start ' , p . start , " end " , p . end , " length " , p . length ) id += 1 def