calloc

How to realloc some memory allocated using calloc?

点点圈 提交于 2020-05-16 10:38:15
问题 I've allocated a string with the calloc function: //string1 and string2 previously declared char *stringClone = calloc(strlen(string1) + 1, sizeof(char)); Now I want to do the same thing on stringClone with a different string. Doing: stringClone = calloc(strlen(string2) + 1, sizeof(char)); I'm gonna have some memory leak, right? How should I use the realloc in this case? 回答1: You can use realloc() to reallocate memory allocated by malloc() , calloc() , realloc() , aligned_alloc() or strdup()

new/delete和malloc/free

北城余情 提交于 2020-03-10 08:56:11
首先我们来谈谈malloc与free malloc和free是C函数库提供的两个函数,malloc从堆上(也叫自由存储区)分配一块合适的内存,程序返回一个指向这块内存的地址。free函数把它归还给内存池供以后使用。 注意的是这块内存并没有以任何形式进行初始化,如果进行初始化:要么自己动手进行初始化,要么使用calloc函数。 两个函数原型: void *malloc(size_t size); void free(void *pointer); malloc的参数就是需要分配的内存字节数(注意malloc不能自动计算字节大小,必须直接传字节数),如果内存池的内存满足这个需求,malloc就会返回一个指向被分配的内存块起始位置的指针;如果内存池为空或者不能满足你的分配需求,malloc将返回一个NULL指针( 这点很重要,每个从malloc分配的内存返回的指针用的时候都要检查是否为NULL )。 free函数的参数要么是NULL(不会产生任何效果),要么就是就是先前从malloc返回的值。只有这两种。释放一块内存的一部分是不允许的,动态分配的内存必须整块一起释放,但是有realloc的特性(缩小一块动态分配的内存),可以有效的释放他尾部的部分内存 注意观察的人会发现malloc返回的是一个 void*,那我们在内存上存储整数,浮点数和其他类型的时候该怎么办?

malloc,calloc,realloc和new的比较

故事扮演 提交于 2020-03-10 08:55:49
malloc与calloc,realloc的区别 malloc 与 calloc,realloc 都可以用来动态分配内存空间,但两者也存在着一些区别: 1. Malloc 函数有一个参数,即要分配的内存空间的大小 2. calloc 有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小 3. 如果分配内存空间成功,则两者都返回分配的内存空间的首地址函数的程序开始 4. malloc 不能初始化所分配的内存空间,而 calloc 能 5. 由于 malloc 分配的内存空间原来没有被使用过,则其中每一位可能都是零,反之,如果这部分内存曾经被使用过,在其中可能留有各种各样的数据,也就是说,使用 malloc 时(内存空间还没有被重新分配)能正常运行,但经过一段时间 ( 内存空间已经重新分配 ) 可能会出现问题 6. 函数 calloc 将分配的内存空间中的每一位初始化为 0 ,也就是说如果你为字符型或数据类型的元素分配内存空间,那么这些元素将被初始化为 0 ,如果你是为指针类型 的元素分配内存空间,那么这些元素会被初始化为空指针,如果你为实型数据分配内存,这些元素会被初始化为浮点型的 0。 7. Realloc 是给一个已经分配了内存的地址指针重新分配空间,参数包括原因的空间地址和重新申请的地址长度 Malloc 与 new 的区别 1.

分配内存

本秂侑毒 提交于 2020-03-03 03:30:25
分配内存的方法 面试中比较见问的一个问题。 注意: 只有calloc函数会将分配内存初始化为0 new是C++独有的,其是运算符,而不是函数。 下面对其分别进行介绍: malloc 函数: void *malloc(unsigned int size) 1 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。 2)calloc 函数: void *calloc(unsigned int num, unsigned int size) 1 按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。 3)realloc 函数: void *realloc(void *ptr, unsigned int size) 1 增加或减少以前分配区的长度。当增加长度时,可能需要将以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区,而新增的区域内的初始值不确定。 4)new是动态分配内存的运算符: 自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作

8.动态内存管理malloc calloc realloc free

半世苍凉 提交于 2020-03-01 21:24:36
malloc 描述 C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。 声明 下面是 malloc() 函数的声明。 void *malloc(size_t size) 参数 size – 内存块的大小,以字节为单位。 返回值 该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。 realloc 描述 C 库函数 void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。 声明 下面是 realloc() 函数的声明。 void *realloc(void *ptr, size_t size) 参数 ptr – 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。 size – 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。 返回值 该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL。 calloc 描述 C 库函数 void

brk和sbrk及内存分配函数相关

空扰寡人 提交于 2020-03-01 03:30:04
brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这 一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理 下将虚拟地址空间映射到内存,供malloc函数使用。(参见linux内核情景分析) #include <unistd.h> int brk(void *end_data_segment); void *sbrk(ptrdiff_t increment); DESCRIPTION brk sets the end of the data segment to the value specified by end_data_segment, when that value is reasonable, the system does have enough memory and the process does not exceed its max data size (see setrlimit(2)). sbrk increments the program's data space by increment

malloc 和alloc及calloc的区别

筅森魡賤 提交于 2020-03-01 03:05:14
C语言跟内存分配方式   (1) 从静态 存储 区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   (2) 在栈上创建。在执行函数时,函数内局部变量的 存储 单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多   C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等.   其中alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间.   calloc则将初始化这部分的内存,设置为0. 而realloc则对malloc申请的内存进行大小的调整.申请的内存最终需要通过函数free来释放. 而sbrk则是增加数据段的大小;   malloc/calloc/free基本上都是C函数库实现的,跟OS无关.C函数库内部通过一定的结构来保存当前有多少可用内存

C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

拥有回忆 提交于 2020-03-01 03:05:02
在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 文字常量区:常量字符串是放在这里的,程序结束后由系统释放。 程序代码区:存放函数体的二进制代码。 C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。它们的声明如下: void * malloc(int n); void free (void * p); void *calloc(int n,int size); void * realloc(void * p,int n); 1. malloc函数 malloc函数可以从堆上获得指定字节的内存空间

C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

孤者浪人 提交于 2020-03-01 03:04:40
在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 文字常量区:常量字符串是放在这里的,程序结束后由系统释放。 程序代码区:存放函数体的二进制代码。 C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。它们的声明如下: 1 void * malloc ( int n); 2 void free ( void * p); 3 void * calloc ( int n, int size); 4 void * realloc ( void * p, int n); 1. malloc函数

C和指针 第十一章 动态内存分配

两盒软妹~` 提交于 2020-02-07 04:00:35
声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存。 C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配和释放, 这些函数维护一个可用的内存池,当程序需要内存时,它就调用malloc从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针,这块内存没有以任何方式进行初始化。 如果需要初始化,可用使用calloc函数。当一块分配的内存不再使用时,程序应该调用free函数把它归还给内存池。 void *malloc(size_t size); void free(void *pointer); 当malloc申请内存失败时,返回的是NULL指针,所以需要 对malloc返回值进行检查 ,确保非NULL。而free的参数,要么是NULL,要么是malloc,calloc或者realloc返回的值。向free传入NULL,不会产生任何效果。 malloc返回的是void *类型的指针,所以有的编译器可能在使用之前,需要行类型转换。 char *sPtr; //类型转换一下 sPtr = (char *)malloc(12); strcpy(sPtr, "yangxunwu"); calloc,也是分配内存,不过在分配之前会把内存初始化为0,而malloc不会初始化 void