calloc

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指针。因此

关于C中内存操作

二次信任 提交于 2020-02-02 14:32:02
from:http://blog.csdn.net/shuaishuai80/article/details/6140979 malloc、calloc、realloc的区别 C Language (1) C语言 跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量. <2>在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. <3>从堆上分配,亦称动态内存分配. 程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由用户决定,使用非常灵活,但问题也最多. (2)C语言跟内存申请相关的函数主要有 alloca、calloc、malloc、free、realloc等. <1>alloca是向栈申请内存,因此无需释放. <2>malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间. <3>calloc则将初始化这部分的内存,设置为0. <4>realloc则对malloc申请的内存进行大小的调整. <5

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和C++ 语言动态内存分配

随声附和 提交于 2020-02-02 00:12:35
一、C语言动态内存分配 要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”) 1.malloc函数   函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。 2.calloc 函数 函数原型为void *calloc(unsigned int num, unsigned int size)   按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为num*size。函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu*) calloc(2,sizeof

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-29 23:02:13
1、分配内存 void * malloc( size_t _Size); void * calloc( size_t _Count, size_t _Size); malloc函数在堆中分配参数_Size指定大小的内存,单位:字节,函数返回void *指针。 calloc函数分配内存的同时把内存清空。第一个参数是所需内存单元数量,第二个参数是每个内存单元的大小(单位:字 节),calloc自动将分配的内存置0。 2、内存重新分配 void * realloc( void *p, size_t _NewSize); 第一个参数 p为之前用malloc或者calloc分配的内存地址,_NewSize为重新分配内存的大小,单位:字节。成功返回新分配 的堆内存地址,失败返回NULL。 Realloc不会自动清理增加的内存,需要手动清理,如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内 存,如果指定的地址后面没有空间,那么realloc会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存。 如果参数p等于NULL,那么realloc与malloc功能一致。 3、内存释放 void free(void *p); free负责在堆中释放malloc分配的内存。参数p为malloc返回的堆中的内存地址。 注:再释放完后,将指针置空。 参考:黑马程序员 来源: CSDN

What happens if I set a value outside of the memory allocated with calloc?

不羁的心 提交于 2020-01-25 05:44:26
问题 Consider the following: int* x = calloc(3,sizeof(int)); x[3] = 100; which is located inside of a function. I get no error when I compile and run the program, but when I run it with valgrind I get an "Invalid write of size 4". I understand that I am accessing a memory place outside of what I have allocated with calloc, but I'm trying to understand what actually happens. Does some address in the stack(?) still have the value 100? Because there must certainly be more available memory than what I

Dynamic Memory

风流意气都作罢 提交于 2020-01-18 21:29:28
Dynamic Memory 目录 Dynamic Memory 目录 malloc free realloc calloc 主要讨论三个函数,还有第四个函数,不过它只是其中一个的变种。 malloc(): 分配内存供使用 free(): 释放 malloc() 分配的内存 realloc(): 改变之前分配的内存的大小 calloc(): 与 malloc() 很像,区别只是它会先把分配的内存先清零 malloc() 当你使用 malloc() 时,它会分配你想要的内存。它的返回值是一个指针,指向一块内存。如果分配失败,返回 NULL。指针的类型是 void* 的,所以你可以强转成任何你想要的类型。 malloc() 操作的内存是以 byte 为单位的,如果想分配更大的内存空间(比如,”给我分配 12 个 int 的空间”),那么就要使用 sizeof() 操作符来决定你需要多少 byte 的空间,比如: int *p; p = malloc(12 * sizeof(int)); // 给我分配 12 个 int 内存的空间 分配好了之后,就可以像一般指针一样来 引用 (reference)这个指针了,毕竟,呃…它就是个指针。 当然,最好在使用它之前,校验一下它的有效性,因为可能 malloc() 会返回 NULL: int *p; p = malloc(12 * sizeof

动态内存分配与指向它的指针变量

谁说我不能喝 提交于 2020-01-04 05:49:44
1.动态内存分配的含义   c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。 2.建立内存的动态分配   对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个函数: (1).使用malloc函数   其函数原型为void *malloc(unsigned int size);   其作用是在内存的动态存储区域中分配一个长度为size的连续空间,形参size的类型定义为无符号整形(不允许为负数)。次函数的值(即返回值)是所分配区域的第一个字节的地址,或者说,次函数是一个指针型函数,返回的指针指向该分配区域的开头位置,如:   malloc(100)//开辟100字节的临时分配区域,函数值为其第一个字节的地址   注意其指针的基类型为void,即不能执行任何类型的数据,只能提供一个地址,如果此函数未能成功执行(如内存空间不足),则返回空指针。 (2).使用calloc函数   其函数原型为void *calloc(unsigned n,

using non allocated space calloc

你离开我真会死。 提交于 2019-12-26 05:38:47
问题 I just wonder that the compiler doesn't throw exception when I use non allocated space , here is a code for example: #include <stdio.h> #include <stdlib.h> int main() { int i, n; int *a; printf("Number of elements to be entered:"); scanf("%d",&n); a = (int*)calloc(n, sizeof(int)); printf("Enter %d numbers:\n",n); for( i=0 ; i < n ; i++ ) { scanf("%d",&a[i]); } printf("The numbers entered are: "); for( i=0 ; i < n ; i++ ) { printf("%d ",a[i]); } free( a ); return(0); } if n=3 for example and I